生活随笔
收集整理的這篇文章主要介紹了
spring-6、动态代理(cglib 与 JDK)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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.當從容器中獲取對象時,如果獲取的對象滿足切入點表達式.那么就會為其創
建代理對象.代理對象指定方法就會執行與切入點綁定的通知方法.
轉載于:https://www.cnblogs.com/chenxiaoxian/p/10431170.html
總結
以上是生活随笔為你收集整理的spring-6、动态代理(cglib 与 JDK)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。