Spring學習之旅(八)Spring 基於AspectJ註解配置的AOP編程工作原理初探,aspectjaop
由小編的上篇博文可以一窺基於AspectJ註解配置的AOP編程實現。
本文一下未貼出的相關程式碼範例請關注小編的上篇博文《Spring學習之旅(七)基於XML配置與基於AspectJ註解配置的AOP編程比較》,在此不再贅述。
基於AspectJ註解配置的AOP編程,就是將所有配置資訊都放在原始碼中以註解的方式標註。以與“基於XML配置”的AOP編程相區別。
1)Spring AOP註解就是依賴AspectJ來實現。因此使用Spring AOP註解,必須引入Aspectj架構及相應的包(aspectjrt.jar和aspectjweaver.jar)。
關於包的下載與引入,請參考小編的另外一篇博文《Spring學習之旅(五)極速建立Spring AOP java工程項目》
所以“基於AspectJ註解配置的AOP編程”實際上是:Spring AOP+AspectJ架構進行切面編程。
2)建立Spring設定檔,並在設定檔中引入aop命名空間和context命名空間,並配置“AspectJ的註解支援”,以及自動掃描的包的支援。
3)基於AspectJ註解聲明切面
即在設計切面類時,在java原始碼中採用註解標註“切面的相關資訊”。
講一個java類聲明為一個切面:
首先,要註解成一個Bean,必須是IoC的Bean,可以是用@Component註解定義Bean。
其次,註解聲明為一個切面,使用@Aspect註解,同時在類的方法註解中給出與該切面相關的“通知”和“切入點”
然後,我們還可以指定切面的優先順序,使用@Order(層級號)。層級號為大於等於0的整數,值越小,優先順序越高。
4)基於AspectJ註解聲明通知
標註在切面類的方法上,AspectJ支援5種類型的通知註解:
@Before、@After、@AfterRunning、@AfterThrowing、@Around
舉一個例子:
//註解為前置通知,並註解其切入點運算式 @Before("execution(* com.edu.aop.ArithmeticCalculator.*(..))") public void validationArgs(JoinPoint joinPoint){ //具體方法實現 }
在上篇博文中的執行個體中,給出了通知內切入點運算式的兩種寫法:一種具體確定的;一種泛化的。
當通知括弧內除了切入點運算式屬性外,還有其他屬性時,應寫明屬性對應的屬性值。
比如:
@AfterRunning(pointcut="execution(* com.edu.aop.*.*(..))",returning="abc") public void afterMethod(JoinPoint joinPoint,Object abc){ //具體方法實現 }
@AfterThrowing(pointcut="execution(* com.edu.aop.*.*(..))",throwing="e") public void afterMethod(JoinPoint joinPoint,ArithmeticException e){ //具體方法實現 }