?今天是劉小愛自學Java的第124天。
感謝你的觀看,謝謝你。
今天學習內容安排如下:
- 切面配置的核心三步驟。
- 傳統sprin配置和AspectJ配置都學下,xml和注解都使用下。
- 同時為了測試,補充說明一下spring的junit集成,幾天前沒來得及學的知識點。
一、傳統Spring AOP編程
這種方式在現在的開發中基本不會使用,但為了更好地和AspectJ對比還是做一個了解。
1切面編程開發三步驟
①確定要增強的target對象
也就是哪些類需要增強?對spring來說,目標就是bean對象。
②配置增強
Advice通知,也就是我們要增強一個什么功能,會在②對應的類中說明。
③配置切入點
即要攔截的連接點有哪些(方法)
id="myPointcut":切入點唯一標識。
expression表達式:匹配方法的。
expression=bean(*Service)表示在spring容器中,所有id/name以Service結尾的bean都能被攔截。
④配置切面
也就是:要對哪些方法(pointcut),進行怎樣的增強?(advice)
- advice-ref="timeLogAdvice",即對應怎樣的增強。
- pointcut-ref="myPointcut",即對應哪些方法需要增強。
2編寫傳統aop的Advice通知類
①環繞通知
通知主要有四類,即增強的位置:
前置通知MethodBeforeAdvice:在目標方法執行前實施增強。
后置通知AfterReturningAdvice:在目標方法執行后實施增強。
環繞通知MethodInterceptor:在目標方法執行前后實施增強。
異常拋出通知ThrowsAdvice:在方法拋出異常后實施增強。
在這里因為我們需要在方法前后實施增強,所以我們使用環繞通知,需要實現對應接口。
注意:接口不要弄混淆了,是org.aoplliance中的接口,不是cglib中的。
②invoke方法
參數為MethodInvocation。
③調用目標對象的方法
這個就相當于method.invoke()。
④記錄日志
這個涉及到日志配置文件的編寫。
3使用spring的junit集成測試
①@RunWith注解和@ContextConfiguration注解
- 通過@RunWith注解,使用junit整合spring。
- 通過@ContextConfiguration注解,指定spring容器的位置。
②@Autowired注解
通過@Autowired注解,注入需要測試的對象,在這里注意2點:
- 將測試對象注入到測試用例中。
- 測試用例不需要配置<context:annotion-config/>,因為使用測試類運行的時候,會自動啟動注解的支持。
③調用測試方法完成測試
二、Aspectj(xml)配置AOP
上述傳統方法中需要實現對應的通知接口,而在Aspectj中就不需要了。
1Xml配置AOP開發方法還是三步:
- 確定要增強誰?(bean)
- 確認增強什么功能?(通知advice)
- 確定需要增強的方法有哪些?(切入點pointcut)
而如何將它們對應起來就需要配置切面了。
①②③和傳統的配置是一樣的,不再贅述,只說不同的地方。
④配置切面
通知是有好幾種的,重點也就是這個通知類型,將其弄懂了,xml和注解也就簡單了:
- aop:before也就是前置通知。
- aop:after-returning也就是后置通知。
- aop:around 也就是環繞通知。
- aop:after-throwing也就是拋出通知。
- aop:after也就是最終通知。
method:通知類中的方法名;pointcut-ref="myPointcut":注入切入點。
2通知類的編寫
因為測試方法和上述是差不多的,所以不再贅述,將測試結果放在一起說明:
配置文件中給指定方法設置通知的類型,beforeTest方法就是前置通知。
增強CustomerServiceImpl類中的所有方法,前置通知就相當于在對應方法之前執行增強的功能。
joinPoint就是連接點,在這里也就是目標對象中的所有方法,該參數是一個可選參數,其有三個常用的方法:
- getSignature()方法:獲取目標對象方法。
- getThis()方法:獲取的是代理對象。
- getTarget()方法:獲取的也就是目標對象。
我這邊只說明一下前置通知,其它的基本上都是大同小異的。
不過每個通知都有自己的應用場景,這個以后遇到具體的場景了再說明。
我會在以后做一個其對應的應用合集。
三、Aspectj注解配置AOP
會了xml,注解就真心很簡單了。
1配置xml文件
①配置注解掃描
②配置aspectj的自動代理機制
設置好這兩個標簽之后,就可以全部都使用注解配置AOP了。
2通知類的編寫
①確認目標對象
用注解將該類放入spring容器中。
②確認增強的功能
@Aspect注解即表示,將其作為aop管理。
③環繞通知
ProceedingJoinPoint是環繞通知中的一個參數,翻譯過來就是可執行的連接點的意思。
通過該參數調用proceed()方法就相當于執行原目標對象中的方法。
④拋出通知
這個是如果出現了異常,就會執行該增強功能,也就相當于try…catch。
當然還有其它幾種通知:
@Before前置通知,相當于BeforeAdvice。
@AfterReturning后置通知,相當于AfterReturningAdvice。
@After最終final通知,不管是否異常,該通知都會執行。
最后
AOP這塊的知識點有點生澀難懂,自己無論是學習效率還是筆記質量這塊都下降了很多,這我也是能感受到的。
只能說目前來說所追求的還是一個學習進度,保證每天都有輸出,至于質量問題只能留待以后一點點優化了。
謝謝你的觀看。
如果可以的話,麻煩幫忙點個贊,謝謝你。