jdk动态代理与cglib动态代理--InvocationHandler--MethodInterceptor
動態(tài)代理是為了實現(xiàn)Aop編程(不修改類源碼,類方法執(zhí)行前后,自定義增強處理, 日志 攔截等等),代理的是類對象
一、jdk動態(tài)代理
被代理的類需要實現(xiàn)接口,針對接口的代理,通過生成一個實現(xiàn)了接口的動態(tài)類實現(xiàn)代理
- ServiceImpl是被代理類,實現(xiàn)接口ServiceInterface
- JDKProxy是代理處理方法類,實現(xiàn)接口InvocationHandler
- 通過JDKProxy.bind()得到j(luò)dk【動態(tài)生成】代理類ServiceProxy (ServiceInterface),當你調(diào)用ServiceProxy.doService()會執(zhí)行JDKProxy的invoke()方法,實現(xiàn)代理
二、cglib動態(tài)代理
通過生成被代理類的【子類】實現(xiàn)代理,所以 Cglib是無法代理final修飾的方法或類
- ServiceImpl是被代理類
- ServiceProxy是代理處理類,實現(xiàn)接口MethodInterceptor
- 通過ServiceProxy.getProxy()動態(tài)生成被代理類子類ServiceImpl_SubClass (ServiceImpl)當你調(diào)ServiceImpl_SubClass.doService()會執(zhí)行ServiceProxy.Intercept()方法,實現(xiàn)代理
上面的jdk與cglib動態(tài)代理例子,沒有改變ServiceInterface接口與ServiceImpl實現(xiàn)類代碼,通過一個代理處理類實現(xiàn)動態(tài)對ServiceImpl的代理,方法執(zhí)行前后增強處理,打印日志,也可以通過try catch捕獲方法中的異常實現(xiàn)事務(wù)控制等等
三、兩者的切換
四、Spring動態(tài)代理用JDK還是用CGLIB
動態(tài)代理又有兩種實現(xiàn)方式:
- 一種方法是直接實現(xiàn)JDK中的InvocationHandler接口
- 另一種方法是繼承CGLIB。
那么問題來了,這兩種方法有啥區(qū)別呢,分別適用于什么情況呢?
首先如果不是很清楚兩者的區(qū)別的話,記住一般情況下InvocationHandler要比CGLIB要好就行了。
如果目標對象的代理至少實現(xiàn)了一個接口,那么就用JDK動態(tài)代理,所有由目標對象實現(xiàn)的接口將全部都被代理。如果目標對象沒有實現(xiàn)任何接口,那么就用CGLIB代理。
但是如果非要使用CGLIB的話,那么CGLIB可能有下面的問題:
剛才提到了,InvocationHandler是實現(xiàn)的接口,而CGLIB則是繼承的父類,那么由于繼承的限制,如果父類中有final的成員,那么是繼承不到的。
還有從Spring 3.2以后不再將CGLIB放在項目的classpath下,而是將CGLIB類打包放在spring-core下面的org.springframework中。這個就意味著基于CGLIB的動態(tài)代理與JDK的動態(tài)代理在支持“just works”就一樣了。
在Spring 4.0中,因為CGLIB代理實例是通過Objenesis創(chuàng)建的,所以代理對象的構(gòu)造器不再有兩次調(diào)用。
想要強制使用CGLIB,那么就設(shè)置aop:config下面的proxy-target-class屬性為true:
<aop:config proxy-target-class="true"><!-- other beans defined here... --> </aop:config>要是使用@AspectJ強制使用CGLIB的話,可以配置aop:aspectj-autoproxy下的proxy-target-class屬性為true:
<aop:aspectj-autoproxy proxy-target-class="true"/>注意: Spring AOP 代理默認實現(xiàn) JDK SpringBOOT AOP 代理默認實現(xiàn) Cglib
參考文章1
參考文章2
總結(jié)
以上是生活随笔為你收集整理的jdk动态代理与cglib动态代理--InvocationHandler--MethodInterceptor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 啊!多么痛的领悟···
- 下一篇: 2021年国货彩妆品牌推广营销趋势