天天看點

Spring -- AOP

AOP:(Aspect Oriented Programing):面向切面程式設計

定義:指在程式運作期間,動态的将某段代碼插入到指定方法的指定位置進行運作的一種程式設計方式;

SpringAOP:面向切面程式設計;底層就是動态代理;

Spring為了簡化動态代理,提供了AOP功能;

使用SpringAOP完成日志記錄動态切入的功能;

1)、導包;

          1、ioc包必須導:

  2、AOP功能包;

2)、寫配置;

3)、實作AOP:(将日志代碼,在業務邏輯運作的時候切入到指定位置)

  1、在切面類裡面配置每一個方法都是何時何地運作

  2、将切面類和業務邏輯元件都加入到容器

  3、告訴SpringIOC容器哪個類是切面類@Aspect

  4、開啟基于注解的AOP功能;

代碼舉例子來通過Spring Aop實作日志代碼的切入:

電腦接口類:

實作類:

切面類:

junit測試代碼:

test2方法在MathCalculator沒實作Calculator的時候可以執行:

結果為:

test01在MathCalculator實作Calculator的情況下執行:

 評論區說到了方法資訊的擷取,那就再說說aop的細節:

目前連接配接點所在方法的方法名、目前傳入的參數值等等。這些資訊都封裝在JoinPoint接口的執行個體對象中。

Spring -- AOP

   在具體的連接配接點上要執行的操作。

  一個切面可以包括一個或者多個通知。

  通知所使用的注解的值往往是切入點表達式。

  前置通知:在方法執行之前執行的通知

  使用@Before注解

  後置通知:後置通知是在連接配接點完成之後執行的,即連接配接點傳回結果或者抛出異常的時候

  使用@After注解

  傳回通知:無論連接配接點是正常傳回還是抛出異常,後置通知都會執行。如果隻想在連接配接點傳回的時候記錄日志,應使用傳回通知代替後置通知。

  使用@AfterReturning注解

  在傳回通知中通路連接配接點的傳回值

  在傳回通知中,隻要将returning屬性添加到@AfterReturning注解中,就可以通路連接配接點的傳回值。該屬性的值即為用來傳入傳回值的參數名稱

  必須在通知方法的簽名中添加一個同名參數。在運作時Spring AOP會通過這個參數傳遞傳回值

  原始的切點表達式需要出現在pointcut屬性中

  異常通知:隻在連接配接點抛出異常時才執行異常通知

  将throwing屬性添加到@AfterThrowing注解中,也可以通路連接配接點抛出的異常。Throwable是所有錯誤和異常類的頂級父類,是以在異常通知方法可以捕獲到任何錯誤和異常。

  如果隻對某種特殊的異常類型感興趣,可以将參數聲明為其他異常的參數類型。然後通知就隻在抛出這個類型及其子類的異常時才被執行

  環繞通知是所有通知類型中功能最為強大的,能夠全面地控制連接配接點,甚至可以控制是否執行連接配接點。

  對于環繞通知來說,連接配接點的參數類型必須是ProceedingJoinPoint。它是 JoinPoint的子接口,允許控制何時執行,是否執行連接配接點。

  在環繞通知中需要明确調用ProceedingJoinPoint的proceed()方法來執行被代理的方法。如果忘記這樣做就會導緻通知被執行了,但目标方法沒有被執行。

  注意:環繞通知的方法需要傳回目标方法執行之後的結果,即調用 joinPoint.proceed();的傳回值,否則會出現空指針異常。

  在編寫AspectJ切面時,可以直接在通知注解中書寫切入點表達式。但同一個切點表達式可能會在多個通知中重複出現。

  在AspectJ切面中,可以通過@Pointcut注解将一個切入點聲明成簡單的方法。切入點的方法體通常是空的,因為将切入點定義與應用程式邏輯混在一起是不合理的。

  切入點方法的通路控制符同時也控制着這個切入點的可見性。如果切入點要在多個切面中共用,最好将它們集中在一個公共的類中。在這種情況下,它們必須被聲明為public。在引入這個切入點時,必須将類名也包括在内。如果類沒有與這個切面放在同一個包中,還必須包含包名。

  其他通知可以通過方法名稱引入該切入點

  在同一個連接配接點上應用不止一個切面時,除非明确指定,否則它們的優先級是不确定的。

  切面的優先級可以通過實作Ordered接口或利用@Order注解指定。

  實作Ordered接口,getOrder()方法的傳回值越小,優先級越高。

  若使用@Order注解,序号出現在注解中

廢話少說,上代碼:

 通過xml配置AOP