最近在回顧spring aop;想想這個(gè)aop很簡(jiǎn)單,無(wú)非就是一個(gè)面向切面編程.spring aop只支持對(duì)方法的連接點(diǎn)。實(shí)際中也是最通用的形式。aop的實(shí)現(xiàn)就是就是代理?,F(xiàn)在對(duì)代理寫點(diǎn)筆記。
可以通過(guò)配置文件或者編程的方式來(lái)使用Spring AOP。
配置可以通過(guò)xml文件來(lái)進(jìn)行,大概有四種方式:
配置ProxyFactoryBean,顯式地設(shè)置advisors, advice, target等配置AutoProxyCreator,這種方式下,還是如以前一樣使用定義的bean,但是從容器中獲得的其實(shí)已經(jīng)是代理對(duì)象通過(guò)<aop:config>來(lái)配置通過(guò)<aop: aspectj-autoproxy>來(lái)配置,使用AspectJ的注解來(lái)標(biāo)識(shí)通知及切入點(diǎn)
注意點(diǎn):
1、默認(rèn)使用Java動(dòng)態(tài)代理來(lái)創(chuàng)建AOP代理,這樣就可以為任何接口實(shí)例創(chuàng)建代理了
2、當(dāng)需要代理的類不是代理接口的時(shí)候,Spring會(huì)切換為使用CGLIB代理,也可強(qiáng)制使用CGLIB
這里一篇文章很好
http://blog.csdn.net/hintcnuie/article/details/10954631
代理分為靜態(tài)代理和動(dòng)態(tài)代理兩種
靜態(tài)代理,就是普通的代理模式
因?yàn)殪o態(tài)代理需要復(fù)寫接口中的所有方法 所有重復(fù)代碼太多 所以出現(xiàn)了動(dòng)態(tài)代理
動(dòng)態(tài)代理 包括 jdk 代理 和gblic 代理
jdk 代理 實(shí)現(xiàn)原理
對(duì)于JDK 的Proxy,有以下幾點(diǎn):
`` Interface:對(duì)于JDK proxy,業(yè)務(wù)類是需要一個(gè)Interface的,這也是一個(gè)缺陷
`` Proxy,Proxy 類是動(dòng)態(tài)產(chǎn)生的,這個(gè)類在調(diào)用Proxy.newProxyInstance(targetCls.getClassLoader, targetCls.getInterface,InvocationHander)之后,會(huì)產(chǎn)生一個(gè)Proxy類的實(shí)例。實(shí)際上這個(gè)Proxy類也是存在的,不僅僅是類的實(shí)例。這個(gè)Proxy類可以保存到硬盤上。
`` Method:對(duì)于業(yè)務(wù)委托類的每個(gè)方法,現(xiàn)在Proxy類里面都不用靜態(tài)顯示出來(lái)
`` InvocationHandler: 這個(gè)類在業(yè)務(wù)委托類執(zhí)行時(shí),會(huì)先調(diào)用invoke方法。invoke方法再執(zhí)行相應(yīng)的代理操作,可以實(shí)現(xiàn)對(duì)業(yè)務(wù)方法的再包裝
GBLIC代理
JDK的動(dòng)態(tài)代理機(jī)制只能代理實(shí)現(xiàn)了接口的類,而不能實(shí)現(xiàn)接口的類就不能實(shí)現(xiàn)JDK的動(dòng)態(tài)代理,cglib是針對(duì)類來(lái)實(shí)現(xiàn)代理的,他的原理是對(duì)指定的目標(biāo)類生成一個(gè)子類,并覆蓋其中方法實(shí)現(xiàn)增強(qiáng),但因?yàn)椴捎玫氖抢^承,所以不能對(duì)final修飾的類進(jìn)行代理。
它是通過(guò)MethodInterceptor 方法攔截器 和 回調(diào)函數(shù)來(lái)實(shí)現(xiàn)代理效果的