Spring AOP的實(shí)現(xiàn)原理詳解及實(shí)例
Spring AOP的實(shí)現(xiàn)原理詳解及實(shí)例
spring 實(shí)現(xiàn)AOP是依賴JDK動(dòng)態(tài)代理和CGLIB代理實(shí)現(xiàn)的。
以下是JDK動(dòng)態(tài)代理和CGLIB代理簡(jiǎn)單介紹
JDK動(dòng)態(tài)代理:其代理對(duì)象必須是某個(gè)接口的實(shí)現(xiàn),它是通過在運(yùn)行期間創(chuàng)建一個(gè)接口的實(shí)現(xiàn)類來完成對(duì)目標(biāo)對(duì)象的代理。
CGLIB代理:實(shí)現(xiàn)原理類似于JDK動(dòng)態(tài)代理,只是它在運(yùn)行期間生成的代理對(duì)象是針對(duì)目標(biāo)類擴(kuò)展的子類。CGLIB是高效的代碼生成包,底層是依靠ASM(開源的Java字節(jié)碼編輯類庫)操作字節(jié)碼實(shí)現(xiàn)的,性能比JDK強(qiáng)。
在Spring中,有接口時(shí)將采用JDK的方式實(shí)現(xiàn)proxy代理對(duì)象,當(dāng)沒有接口時(shí),將采用cglib中的方式實(shí)現(xiàn)prixy代理對(duì)象。詳情如下:
// JDK方式:PersonService為接口,PersonServiceBean為實(shí)現(xiàn)類, public class JDKProxyFactory implements InvocationHandler { private Object targetObject; public Object createProxyIntance(Object targetObject) { this.targetObject=targetObject; return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), this); } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { PersonServiceBean person=(PersonServiceBean)this.targetObject; Object result=null; if(person.getUser()!=null) { result = method.invoke(targetObject, args); } return result; } }
//使用CGlib包實(shí)現(xiàn):PersonServiceBean為實(shí)現(xiàn)類, 而沒有PersonService接口, public class CGlibProxyFactory implements MethodInterceptor{ private Object targetObject; public Object createProxyInstance(Object targetObject) { this.targetObject=targetObject; Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(this.targetObject.getClass());//設(shè)置目標(biāo)類的子類,該子類會(huì)覆蓋所有父類中的非final方法 enhancer.setCallback(this);//設(shè)置回調(diào) return enhancer.create(); } public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { PersonServiceBean person=(PersonServiceBean)this.targetObject; Object result=null; if(person.getUser()!=null) { result = methodProxy.invoke(targetObject, args); } return null; } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
jsp+ajax實(shí)現(xiàn)的局部刷新較驗(yàn)驗(yàn)證碼(onblur事件觸發(fā)較驗(yàn))
這篇文章主要介紹了jsp+ajax實(shí)現(xiàn)的局部刷新較驗(yàn)驗(yàn)證碼,基于onblur事件觸發(fā)較驗(yàn)功能,以實(shí)例形式詳細(xì)的分析了前臺(tái)顯示、圖片生成及Ajax動(dòng)態(tài)驗(yàn)證等詳細(xì)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10JSP靜態(tài)導(dǎo)入與動(dòng)態(tài)導(dǎo)入使用詳解
這篇文章主要介紹了JSP靜態(tài)導(dǎo)入與動(dòng)態(tài)導(dǎo)入使用詳解,文章通過include指令的使用格式,詳細(xì)介紹了靜態(tài)與動(dòng)態(tài)注入的使用方法,對(duì)大家的學(xué)習(xí)或經(jīng)驗(yàn)積累有一定的參考價(jià)值,需要的朋友可以參考下2020-08-08Jsp中response對(duì)象的所有屬性詳細(xì)介紹
這篇文章主要介紹了Jsp中response對(duì)象的所有屬性,有需要的朋友可以參考一下2013-11-11jsp+servlet+jdbc實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的增刪改查
本篇文章主要介紹了jsp+servlet+jdbc實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的增刪改查,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01JSP開發(fā)之生成圖片驗(yàn)證碼技術(shù)的詳解
這篇文章主要介紹了JSP開發(fā)之生成圖片驗(yàn)證碼技術(shù)的詳解的相關(guān)資料,希望通過本文能幫助到大家實(shí)現(xiàn)圖片驗(yàn)證碼技術(shù),需要的朋友可以參考下2017-09-09