和大家一起聊一聊java代理模式
1、靜態(tài)代理
1.1靜態(tài)代理的代理類(lèi)和和被代理的類(lèi)都要維護(hù)一個(gè)共同的接口。
1
2
3
|
public interface IUserDao { void save(); } |
1.2被代理的類(lèi),目標(biāo)對(duì)象
1
2
3
4
5
6
|
public class UserDao implements IUserDao{ @Override public void save() { System.out.println( "-----已經(jīng)保存數(shù)據(jù)!!!------" ); } } |
1.3代理對(duì)象
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class UserDaoProxy implements IUserDao{ // 接收保存目標(biāo)對(duì)象 private IUserDao target; public UserDaoProxy(IUserDao target) { this .target = target; } @Override public void save() { System.out.println( "開(kāi)始事務(wù)..." ); target.save(); // 執(zhí)行目標(biāo)對(duì)象的方法 System.out.println( "提交事務(wù)..." ); } } |
1.4測(cè)試類(lèi)
1
2
3
4
5
6
7
8
9
|
public class App { public static void main(String[] args) { // 目標(biāo)對(duì)象 IUserDao target = new UserDao(); // 代理 IUserDao proxy = new UserDaoProxy(target); proxy.save(); // 執(zhí)行的是,代理的方法 } } |
2、動(dòng)態(tài)代理
2.1同樣的,動(dòng)態(tài)代理也需要完成一個(gè)接口。(同上)
2.2目標(biāo)對(duì)象也是相同的。
2.3只是在代理對(duì)象上有所不同
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public class ProxyFactory { // 維護(hù)一個(gè)目標(biāo)對(duì)象 private Object target; public ProxyFactory(Object target){ this .target = target; } // 給目標(biāo)對(duì)象,生成代理對(duì)象 public Object getProxyInstance() { return Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println( "開(kāi)啟事務(wù)" ); // 執(zhí)行目標(biāo)對(duì)象方法 Object returnValue = method.invoke(target, args); System.out.println( "提交事務(wù)" ); return returnValue; } }); } } |
2.4測(cè)試類(lèi)
1
2
3
4
5
6
7
8
9
10
11
12
|
public class App { public static void main(String[] args) { // 目標(biāo)對(duì)象 IUserDao target = new UserDao(); System.out.println(target.getClass()); // 給目標(biāo)對(duì)象,創(chuàng)建代理對(duì)象 IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance(); System.out.println(proxy.getClass()); // 執(zhí)行方法 【代理對(duì)象】 proxy.save(); } } |
3、cglib代理
3.1cglib代理不需要完成接口,只需要寫(xiě)被代理的類(lèi)和代理類(lèi)即可,此處被代理類(lèi)同1.2,所以不再編寫(xiě)。
3.2代理類(lèi)有所不同,用到cglib代理模式需要引用spring的核心框架包。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class ProxyFactory implements MethodInterceptor{ // 維護(hù)目標(biāo)對(duì)象 private Object target; public ProxyFactory(Object target){ this .target = target; } // 給目標(biāo)對(duì)象創(chuàng)建代理對(duì)象 public Object getProxyInstance(){ //1. 工具類(lèi) Enhancer en = new Enhancer(); //2. 設(shè)置父類(lèi) en.setSuperclass(target.getClass()); //3. 設(shè)置回調(diào)函數(shù) en.setCallback( this ); //4. 創(chuàng)建子類(lèi)(代理對(duì)象) return en.create(); } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println( "開(kāi)始事務(wù)....." ); // 執(zhí)行目標(biāo)對(duì)象的方法 Object returnValue = method.invoke(target, args); System.out.println( "提交事務(wù)....." ); return returnValue; } } |
3.3測(cè)試類(lèi)
1
2
3
4
5
6
7
8
9
10
11
12
|
public class App { public static void main(String[] args) { // 目標(biāo)對(duì)象 UserDao target = new UserDao(); System.out.println(target.getClass()); // 代理對(duì)象 UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance(); System.out.println(proxy.getClass()); // 執(zhí)行代理對(duì)象的方法 proxy.save(); } } |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。