2.如果目標(biāo)對(duì)象沒有實(shí)現(xiàn)任何接口,Spring使用CGLIB庫生成目標(biāo)對(duì)象的子類。在創(chuàng)建這個(gè)子類的時(shí)候,Spring將通知織入,并且將對(duì)目標(biāo)對(duì)象的調(diào)用委托給這個(gè)子類。
下面以一個(gè)實(shí)例說明Spring AOP的基本開發(fā)方法:
一.創(chuàng)建通知
Spring連接點(diǎn)模型是建立在方法攔截上,這意味著你編寫的Spring通知會(huì)在方法調(diào)用周圍的各個(gè)地方織入系統(tǒng)中。

圖1
TestAopServiceAdvice實(shí)現(xiàn)了接口MethodBeforeAdvice(前置通知),并實(shí)現(xiàn)它的惟一的方法before,這個(gè)類就可以在調(diào)用目標(biāo)對(duì)象前被調(diào)用。同樣的還有AfterReturningAdvice(后置通知),MethodInterceptor(環(huán)繞通知),異常通知(ThrowsAdvice),引入通知等。
在這個(gè)方法中我們輸出了一個(gè)字符串TestAopServiceAdvice,用于驗(yàn)證這個(gè)方法是否在目標(biāo)對(duì)象前調(diào)用了。
注意:我們無法改變before方法中的參數(shù)args和target中的值,args中存的是原來要傳入目標(biāo)對(duì)象的變量,target即指目標(biāo)對(duì)象。
二.配置Spring XML配置文件
要在Spring中實(shí)現(xiàn)AOP,一般情況下需要配置4個(gè)bean:
1.目標(biāo)對(duì)象(target)
2.通知(advice)
3.切入點(diǎn)(pointcut)
4.代理(proxy)

圖2
切入點(diǎn)又分為靜態(tài)切入點(diǎn)和動(dòng)態(tài)切入點(diǎn)
1、 靜態(tài)切入點(diǎn)的意思是通知總是被執(zhí)行,也是最常用的一種切入點(diǎn)。
2、 動(dòng)態(tài)切入點(diǎn)根據(jù)運(yùn)行時(shí)方法的參數(shù)值決定通知是否被執(zhí)行。
在圖2中,定義了使用了一個(gè)Spring提供的靜態(tài)切入點(diǎn)
NameMatchMethodPointAdvisor,它保證了當(dāng)被調(diào)用的方法的名字與給出的映射名字相匹配的時(shí)候,這個(gè)切入點(diǎn)才匹配。
Spring提供的另一個(gè)靜態(tài)切入點(diǎn)為RegexpMethodPointcutAdvisor,讓你可以利用正則表達(dá)式來定義切入點(diǎn).
使用ProxyBeanFactory可以創(chuàng)建一個(gè)被通知的類,即代理對(duì)象。它的最常用的二個(gè)控制行為的屬性是:
1、proxyInterfaces:代理應(yīng)該實(shí)現(xiàn)的接口列表
2、interceptorNames:需要應(yīng)用到目標(biāo)對(duì)象上的通知Bean的名字??梢允菙r截器、Advisor或其他通知類的名字。
注:在用容器的getBean方法時(shí),應(yīng)該是getBean(代理類的名字),而不是getBean(目標(biāo)對(duì)象的名字),否則AOP無法工作。
|