此前對於AOP的使用僅限於聲明式事務,除此以外在實際開發中也沒有遇到過與之相關的問題。最近項目中遇到了如下幾點需求,仔細思考以後,以爲採用AOP 來解決。一方面是爲了以更加靈活的方式來解決問題,另外一方面是藉此機會深刻學習Spring AOP相關的內容。本文是權當本人的本身AOP學習筆記,如下需求不用AOP確定也能解決,至因而否牽強附會,仁者見仁智者見智。spring
事實上,以上需求沒有AOP也能搞定,只是在實現過程當中比較鬱悶擺了。express
終於下定決心,採用AOP來解決!代碼以下:app
切面類TestAspectide
ApplicationContext模塊化
測試類AOPTest函數
運行結果以下:學習
《Spring參考手冊》中定義瞭如下幾個AOP的重要概念,結合以上代碼分析以下:測試
<aop:config>
的 proxy-target-class
屬性設爲true通知(Advice)類型spa
切入點表達式代理
modifiers-pattern:方法的操做權限
ret-type-pattern:返回值
declaring-type-pattern:方法所在的包
name-pattern:方法名
parm-pattern:參數名
throws-pattern:異常
其中,除ret-type-pattern和name-pattern以外,其餘都是可 選的。上例中,execution(* com.spring.service.*.*(..))表示com.spring.service包下,返回值爲任意類型;方法名任意;參數不做限制的 全部方法。
能夠經過args來綁定參數,這樣就能夠在通知(Advice)中訪問具體參數了。例如,<aop:aspect>配置以下
TestAspect的doAfter方法中就能夠訪問msg參數,但這樣以來 AService中的barA()和BServiceImpl中的barB()就再也不是鏈接點,由於execution(* com.spring.service.*.*(String,..))只配置第一個參數爲String類型的方法。其中,doAfter方法定義以下:
任何通知(Advice)方法能夠將第一個參數定義爲 org.aspectj.lang.JoinPoint
類型。JoinPoint
接口提供了一系列有用的方法, 好比 getArgs()
(返回方法參數)、getThis()
(返回代理對象)、getTarget()
(返回目標)、getSignature()
(返回正在被通知的方法相關信息)和 toString()
(打印出正在被通知的方法的有用信息。