今天學(xué)習(xí)內(nèi)容安排如下:
- 切面配置的核心三步驟。
- 傳統(tǒng)sprin配置和AspectJ配置都學(xué)下,xml和注解都使用下。
- 同時(shí)為了測(cè)試,補(bǔ)充說明一下spring的junit集成,幾天前沒來得及學(xué)的知識(shí)點(diǎn)。
一、傳統(tǒng)Spring AOP編程
這種方式在現(xiàn)在的開發(fā)中基本不會(huì)使用,但為了更好地和AspectJ對(duì)比還是做一個(gè)了解。
1切面編程開發(fā)三步驟

①確定要增強(qiáng)的target對(duì)象
也就是哪些類需要增強(qiáng)?對(duì)spring來說,目標(biāo)就是bean對(duì)象。
②配置增強(qiáng)
Advice通知,也就是我們要增強(qiáng)一個(gè)什么功能,會(huì)在②對(duì)應(yīng)的類中說明。
③配置切入點(diǎn)
即要攔截的連接點(diǎn)有哪些(方法)
- id="myPointcut":切入點(diǎn)唯一標(biāo)識(shí)。
- expression表達(dá)式:匹配方法的。
expression=bean(*Service)表示在spring容器中,所有id/name以Service結(jié)尾的bean都能被攔截。
④配置切面
也就是:要對(duì)哪些方法(pointcut),進(jìn)行怎樣的增強(qiáng)?(advice)
- advice-ref="timeLogAdvice",即對(duì)應(yīng)怎樣的增強(qiáng)。
- pointcut-ref="myPointcut",即對(duì)應(yīng)哪些方法需要增強(qiáng)。
2編寫傳統(tǒng)aop的Advice通知類

①環(huán)繞通知
通知主要有四類,即增強(qiáng)的位置:
- 前置通知MethodBeforeAdvice:在目標(biāo)方法執(zhí)行前實(shí)施增強(qiáng)。
- 后置通知AfterReturningAdvice:在目標(biāo)方法執(zhí)行后實(shí)施增強(qiáng)。
- 環(huán)繞通知MethodInterceptor:在目標(biāo)方法執(zhí)行前后實(shí)施增強(qiáng)。
- 異常拋出通知ThrowsAdvice:在方法拋出異常后實(shí)施增強(qiáng)。
在這里因?yàn)槲覀冃枰诜椒ㄇ昂髮?shí)施增強(qiáng),所以我們使用環(huán)繞通知,需要實(shí)現(xiàn)對(duì)應(yīng)接口。
注意:接口不要弄混淆了,是org.aoplliance中的接口,不是cglib中的。

②invoke方法
參數(shù)為Methodinvocation。
③調(diào)用目標(biāo)對(duì)象的方法
這個(gè)就相當(dāng)于method.invoke()。
④記錄日志
這個(gè)涉及到日志配置文件的編寫。
3使用spring的junit集成測(cè)試

①@RunWith注解和@ContextConfiguration注解
- 通過@RunWith注解,使用junit整合spring。
- 通過@ContextConfiguration注解,指定spring容器的位置。
②@Autowired注解
通過@Autowired注解,注入需要測(cè)試的對(duì)象,在這里注意2點(diǎn):
- 將測(cè)試對(duì)象注入到測(cè)試用例中。
- 測(cè)試用例不需要配置<context:annotion-config/>,因?yàn)槭褂脺y(cè)試類運(yùn)行的時(shí)候,會(huì)自動(dòng)啟動(dòng)注解的支持。
③調(diào)用測(cè)試方法完成測(cè)試
二、Aspectj(xml)配置AOP
上述傳統(tǒng)方法中需要實(shí)現(xiàn)對(duì)應(yīng)的通知接口,而在Aspectj中就不需要了。
1Xml配置AOP開發(fā)方法還是三步:
- 確定要增強(qiáng)誰?(bean)
- 確認(rèn)增強(qiáng)什么功能?(通知advice)
- 確定需要增強(qiáng)的方法有哪些?(切入點(diǎn)pointcut)
而如何將它們對(duì)應(yīng)起來就需要配置切面了。

①②③和傳統(tǒng)的配置是一樣的,不再贅述,只說不同的地方。
④配置切面
通知是有好幾種的,重點(diǎn)也就是這個(gè)通知類型,將其弄懂了,xml和注解也就簡(jiǎn)單了:
- aop:before也就是前置通知。
- aop:after-returning也就是后置通知。
- aop:around 也就是環(huán)繞通知。
- aop:after-throwing也就是拋出通知。
- aop:after也就是最終通知。
method:通知類中的方法名;pointcut-ref="myPointcut":注入切入點(diǎn)。
2通知類的編寫
因?yàn)闇y(cè)試方法和上述是差不多的,所以不再贅述,將測(cè)試結(jié)果放在一起說明:

配置文件中給指定方法設(shè)置通知的類型,beforeTest方法就是前置通知。
增強(qiáng)CustomerServiceImpl類中的所有方法,前置通知就相當(dāng)于在對(duì)應(yīng)方法之前執(zhí)行增強(qiáng)的功能。
joinPoint就是連接點(diǎn),在這里也就是目標(biāo)對(duì)象中的所有方法,該參數(shù)是一個(gè)可選參數(shù),其有三個(gè)常用的方法:
- getSignature()方法:獲取目標(biāo)對(duì)象中的方法。
- getThis()方法:獲取的是代理對(duì)象。
- getTarget()方法:獲取的也就是目標(biāo)對(duì)象。
我這邊只說明一下前置通知,其它的基本上都是大同小異的。
不過每個(gè)通知都有自己的應(yīng)用場(chǎng)景,這個(gè)以后遇到具體的場(chǎng)景了再說明。
我會(huì)在以后做一個(gè)其對(duì)應(yīng)的應(yīng)用合集。
三、Aspectj注解配置AOP
會(huì)了xml,注解就真心很簡(jiǎn)單了。
1配置xml文件

①配置注解掃描
②配置aspectj的自動(dòng)代理機(jī)制
設(shè)置好這兩個(gè)標(biāo)簽之后,就可以全部都使用注解配置AOP了
2通知類的編寫

①確認(rèn)目標(biāo)對(duì)象
用注解將該類放入spring容器中。
②確認(rèn)增強(qiáng)的功能
@Aspect注解即表示,將其作為aop管理。
③環(huán)繞通知
ProceedingJoinPoint是環(huán)繞通知中的一個(gè)參數(shù),翻譯過來就是可執(zhí)行的連接點(diǎn)的意思。
通過該參數(shù)調(diào)用proceed()方法就相當(dāng)于執(zhí)行原目標(biāo)對(duì)象中的方法。
④拋出通知
這個(gè)是如果出現(xiàn)了異常,就會(huì)執(zhí)行該增強(qiáng)功能,也就相當(dāng)于try…catch。
當(dāng)然還有其它幾種通知:
- @Before前置通知,相當(dāng)于BeforeAdvice。
- @AfterReturning后置通知,相當(dāng)于AfterReturningAdvice。
- @After最終final通知,不管是否異常,該通知都會(huì)執(zhí)行。
最后
AOP這塊的知識(shí)點(diǎn)有點(diǎn)生澀難懂,自己無論是學(xué)習(xí)效率還是筆記質(zhì)量這塊都下降了很多,這我也是能感受到的。
只能說目前來說所追求的還是一個(gè)學(xué)習(xí)進(jìn)度,保證每天都有輸出,至于質(zhì)量問題只能留待以后一點(diǎn)點(diǎn)優(yōu)化了。
謝謝你的觀看。
如果可以的話,麻煩幫忙點(diǎn)個(gè)贊,謝謝你。