通常來說Spring AOP有兩種代理方式,一種默認的JDK代理,只能代理接口,一種是CGLIB代理,可以代理具體的類對象。
SpringAOP默認為對AOP代理使用標準的JDK動態代理。如果業務對象不實現接口,則使用CGLIB。
如果使用CGLIB,要注意對于CGLIB,不能advice final方法,因為它們不能在運行時生成的子類中被重寫。
cglib與jdk代理的區別、由于Spring的AOP框架基于代理的特性,根據定義,目標對象內的方法調用不會被攔截。對于JDK代理,只能截獲對代理的公共接口方法調用。使用cglib,可以截獲代理上的公共和受保護的方法調用(如果需要,甚至可以截獲包可見的方法)。
如果需要攔截在目標類內的方法調用甚至構造函數,那么考慮使用Spring驅動的native AspectJ weaving,而不是Spring的基于代理的AOP框架。
要強制使用CGLIB代理,請將元素的proxy target class屬性的值設置為true,如下所示:
<aop:config
要在使用@Aspectj auto proxy支持時強制cglib代理,請將元素的proxy-target-class屬性設置為true,如下所示:
<aop:aspectj-autoproxy
SpringAOP是基于代理的,那什么是代理呢?
cglib動態代理,首先我們考慮一個最簡單的POJO對象:
public
如果直接調用該對象的方法,則運行原理如下所示:
調用方法如下:
public
typec接口原理,如果是調用代理,則運行原理如下:
調用方法如下:
public
本文的例子請參考aop-proxy
sdio接口。更多教程請參考 flydean的博客
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态