JDK動態代理與Cglib動態代理


JDK動態代理:

1.能夠繼承靜態代理的全部優點.並且能夠實現代碼的復用.
2.動態代理可以處理一類業務.只要滿足條件 都可以通過代理對象進行處
理.
3.動態代理的靈活性不強.
4.JDK 的動態代理要求代理者必須實現接口, , 否則不能生成代理對象. .

 1 package proxy;  2 
 3 import java.lang.reflect.InvocationHandler;  4 import java.lang.reflect.Method;  5 import java.lang.reflect.Proxy;  6 
 7 import service.UserService;  8 import tx.TransactionManager;  9 
10 public class DynamicProxy { 11     
12     //創建代理對象 需要傳入真實對象和事務對象
13     public static Object getProxy(final UserService target,final TransactionManager tx){ 14         /**
15  * loader 真實對象的類加載器 16  * interfaces 真實對象的接口 17  * h 18  * 問題:是否能夠不傳接口?? 必須要求傳入接口 19          */
20         Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), 21  target.getClass().getInterfaces(), 22                 new InvocationHandler() { 23                     
24                     //當代理對象調用方法時才會執行invoke操作
25  @Override 26                     public Object invoke(Object proxy, Method method, Object[] args) 27                             throws Throwable { 28                 
29                         tx.begin(); //事務開始
30                         Object result = method.invoke(target, args);//調用目標方法
31  tx.commit(); 32                         return result; 33  } 34  } 35  ); 36         
37         return proxy; 38  } 39 }

 

 

 

-------------------------------------------------------------------------------

Cglib動態代理:

1.不管有無接口都可以創建代理對象.
2.cglib創建的代理對象是目標對象的子類.

 1 package proxy;  2 
 3 import java.lang.reflect.InvocationHandler;  4 import java.lang.reflect.Method;  5 import java.lang.reflect.Proxy;  6 
 7 import org.springframework.cglib.proxy.Enhancer;  8 import org.springframework.cglib.proxy.MethodInterceptor;  9 import org.springframework.cglib.proxy.MethodProxy; 10 
11 import service.UserService; 12 import tx.TransactionManager; 13 
14 public class DynamicProxy { 15     
16     //創建代理對象 需要傳入真實對象和事務對象
17     public static Object getProxy(final UserService target,final TransactionManager tx){ 18         
19         //1.創建增強器 底層實現是通過二進制碼的方式
20         Enhancer enhancer = new Enhancer(); 21         
22         //2.設置接口
23  enhancer.setInterfaces(target.getClass().getInterfaces()); 24         
25         //3.設置父類 cgLib創建的代理對象都是目標對象的子類
26  enhancer.setSuperclass(target.getClass()); 27         
28         //4.設置回調
29         enhancer.setCallback(new MethodInterceptor() { 30             
31  @Override 32             public Object intercept(Object proxy, Method method, Object[] args, 33                     MethodProxy methodProxy) throws Throwable { 34                 
35  tx.begin(); 36                 //通過目標對象調用方法
37                 Object result = method.invoke(target, args); 38  tx.commit(); 39                 
40                 return result; 41  } 42  }); 43         
44         //獲取代理對象
45         return enhancer.create(); 46  } 47 }

 

另:

使用spring的AOP代理對象生成策略:

1.在spring中默認條件下如果目標對象有接口,則使用JDK的動態代理.
 如果目標對象沒有接口則默認使用cgLib動態代理.

2.當從容器中獲取對象時,如果獲取的對象滿足切入點表達式.那么就會為其創
建代理對象.代理對象指定方法就會執行與切入點綁定的通知方法.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM