Spring| AOP 之代理機制

Spring AOP通過代理模式實現,目前支持兩種代理:JDK動態代理、CGLIB代理來創建AOP代理,Spring建議優先使用JDK動態代理。


一. JDK動態代理

使用java.lang.reflect.Proxy動態代理實現,即提取目標對象的接口,然後對接口創建AOP代理。


二. CGLIB代理

CGLIB代理不僅能進行接口代理,也能進行類代理,CGLIB代理需要注意以下問題:

  • 1.不能通知final方法,因爲final方法不能被覆蓋(CGLIB通過生成子類來創建代理)。
  • 2.會產生兩次構造器調用,第一次是目標類的構造器調用,第二次是CGLIB生成的代理類的構造器調用。如果需要CGLIB代理方法,請確保兩次構造器調用不影響應用。

Spring AOP默認首先使用JDK動態代理來代理目標對象,如果目標對象沒有實現任何接口將使用CGLIB代理,如果需要強制使用CGLIB代理,請使用如下方式指定:

對於Schema風格配置切面使用如下方式來指定使用CGLIB代理:

<aop:config proxy-target-class="true">  
</aop:config>  

而如果使用@AspectJ風格使用如下方式來指定使用CGLIB代理:

<aop:aspectj-autoproxy proxy-target-class="true"/>  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章