Spring的AOP就是通過動態代理實現的。當為某個Bean或者某些Bean配置切面時,Spring會為其創建代理對象,當調用該對象的某個方法時,實際是調用生成的代理類的對象方法。Spring的Aop主要是使用了兩個動態代理,分別是JDK的動態代理和CGLIB動態代理。
如果代理類實現了接口,Spring默認會使用JDK動態代理。JDK的動態代理是基于反射實現。JDK通過反射,生成一個代理類,這個代理類實現了原來那個類的全部接口,并對接口中定義的所有方法進行了代理。當我們通過代理對象執行原來那個類的方法時,代理類底層會通過反射機制,調用我們實現的InvocationHandler接口的invoke方法。
/**接口類*/publicinterfacePerson{voidsay();}*接口實現類publicclassManimplementsPerson{privateStringword;publicMan(Stringword){this.word=word;}publicMan(){publicvoidsay(){System.out.println("ManCanSay"+word);publicclassManJDKProxyimplementsInvocationHandler{/***需要的代理對象*/privateObjecto;publicObjectbind(Objecto){this.o=o;returnProxy.newProxyInstance(o.getClass().getClassLoader(),o.getClass().getInterfaces(),this);@OverridepublicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{System.out.println("JDKProxyDesign");returnmethod.invoke(o,args);/***JDK動態代理publicclassProxyDesign_2{publicstaticvoidmain(String[]args){Manman=newMan("Hello");Personp=(Person)newManJDKProxy().bind(man);p.say();
* JDK動態代理的優缺點
優點:
1. JDK動態代理是JDK原生的,不需要任何依賴即可使用
2. 通過反射機制生成代理類的速度要比CGLib操作字節碼生成代理類的速度更快
缺點:
1. 如果要使用JDK動態代理,被代理的類必須實現了接口,否則無法代理(InvocationHandler)
2. JDK動態代理無法為沒有在接口中定義的方法實現代理
3. JDK動態代理執行代理方法時,需要通過反射機制進行回調,此時方法執行的效率比較低
若需要代理的類沒有實現接口,JDK的動態代理就無法使用,Spring會使用CGLiB動態代理來生成代理對象。CGLiB直接操作字節碼,生成類的子類,重寫類的方法完成代理。
/**接口類*/publicinterfacePerson{voidsay();}*接口實現類publicclassManimplementsPerson{privateStringword;publicMan(Stringword){this.word=word;}publicMan(){publicvoidsay(){System.out.println("ManCanSay"+word);publicclassManCGLIBProxy{publicObjectbind(Objecttarget){Enhancerenhancer=newEnhancer();enhancer.setSuperclass(target.getClass());enhancer.setCallback(newMethodInterceptor(){@OverridepublicObjectintercept(Objecto,Methodmethod,Object[]objects,MethodProxymethodProxy)throwsThrowable{System.out.println("CGLIBProxyDesign");returnmethod.invoke(target,objects);}});returnenhancer.create();/***CGLIB動態代理publicclassProxyDesign_3{publicstaticvoidmain(String[]args){Manman=newMan("Hello");Personp=(Person)newManCGLIBProxy().bind(man);p.say();
* CGLiB動態代理的優缺點
優點:
1. 使用CGLiB代理的類,不需要實現接口,因為CGLib生成的代理類是直接繼承自需要被代理的類
2. 因為CGLiB實現方式是重寫父類的方法,所以對final方法,或者private方法是沒有辦法代理的
3. CGLiB是通過修改字節碼生成的代理類,所以CGLib執行代理方法的效率要高于JDK的動態代理
缺點:
1. 因為CGLiB實現方式是重寫父類的方法,所以對final方法,或者private方法是沒有辦法代理的
2. 因為CGLiB生成代理類的方式是通過操作字節碼(asm工具包),這種生成的代理類的方式比JDK通過反射生成代理類的方式的效率低
* xml方式
<!--aop:config用來在xml中配置切面,指定proxy-target-class="true"--><aop:configproxy-target-class="true"><!--AOP相關配置--></aop:config>
* @Aspect注解方式
<!--將proxy-target-class配置設置為true--><aop:aspectj-autoproxyproxy-target-class="true"/>
* 配置類注解方式
添加@EnableAspectJAutoProxy(proxyTargetClass=true)
本文由 貴州做網站公司 整理發布,部分圖文來源于互聯網,如有侵權,請聯系我們刪除,謝謝!
c語言中正確的字符常量是用一對單引號將一個字符括起表示合法的字符常量。例如‘a’。數值包括整型、浮點型。整型可用十進制,八進制,十六進制。八進制前面要加0,后面...
2022年天津專場考試原定于3月19日舉行,受疫情影響確定延期,但目前延期后的考試時間推遲。 符合報名條件的考生,須在規定時間登錄招考資訊網(www.zha...
:喜歡聽,樂意看。指很受歡迎?!巴卣官Y料”喜聞樂見:[ xǐ wén lè jiàn ]詳細解釋1. 【解釋】:喜歡聽,樂意看。指很受歡迎。2. 【示例】:這是...
余額寶投了30萬沒了,如果是資金被盜,非個人原因丟失,而你又有賬戶安全險,那么,支付寶是會賠的;如果是因為個人原因或者投資失利,支付寶不會賠。支付寶余額寶投的是貨幣基金,并不保本、保收益,隨著收益率越來越低,很多人都擔心投的錢會沒了,其實,大可不必。余額寶的錢是可以隨時轉出來的,且貨幣基金的收益較穩定,不會出現劇跌,用戶可以在收益率跌破之前及時轉出來,至少能讓本金不受損失。其實余額寶是支付寶擔保的...
校企合作適應社會與市場需要,注重學生實踐技能;校企合作是一種雙贏模式。 下面是小編整理的校企合作的意義及幾種合作模式,校企合作的優點和缺點,一起來看看吧!校企合作的意義及幾種合作模式加強校企合作,校企雙方互相支持、互相滲透、雙向介入、優勢互補、資源互用、利益共享,共同培養技能人才,對經濟社會發展有著十分重要意義。1. 校企合作,有利于經濟社會的發展進入21世紀以來,隨著國家經濟結構調整,我國正由制...
(資料圖片)哈嘍小伙伴們,在日常生活中我們或多或少的都會接觸到有翡演員表方面的一些說法,有的小伙伴還不是很了解,今天就給大家詳細的介紹一下關于有翡演員表的相關內容。1、趙麗穎 飾 周翡2、王一博 飾 謝允3、張慧雯 飾 吳楚楚4、陳若軒 飾 李晟5、周潔瓊 飾 李妍6、張昕宇 飾 楊瑾7、胡兵 飾 李徵8、孫堅 飾 殷沛9、車曉 飾 李瑾容10、王婉娟 飾 霓裳夫人11、《有翡》是由華策克頓旗下好...