JavaSpring【五、AOP基礎】

weixin_30639719發表於2020-04-05

概念:

AOP——面向切面程式設計,通過預編譯/動態代理實現程式功能的統一維護
主要功能是:日誌、效能統計、安全控制、事務處理、異常處理

實現方式

  • 預編譯——AspectJ
  • 動態代理——SpringAOP、JbossAOP

常用概念

692906-20170510111512957-1843257274.png

  • Advice通知的型別
    692906-20170510112643207-1440662276.png

Spring的AOP實現

  • 純Java實現,無需特殊編譯,不需要控制類載入器
  • 只支援方法執行連線點
  • 目的是提供一種APO與SpringIOC之間的整合
  • 與AspectJ相比,SpringAOP並不全面

有介面和無介面的SpringAOP的區別(沒看懂)

  • 有介面,預設使用標準JavaSErvice動態代理作為AOP代理
  • 無介面使用CGLIB代理

配置、切面實現、切入點,切入方式

Demo:
首先需要增加依賴包
692906-20170511140908332-1360956705.png

在Spring.xml中配置切面
692906-20170511141259363-332000420.png

切入點
692906-20170511141320332-306303487.png
692906-20170511141337941-310533771.png

切面實現
692906-20170511141402379-1312852202.png

帶參切入方法實現
692906-20170511141430301-216323612.png

測試類
692906-20170511141446597-654960520.png

帶參切入點測試結果
692906-20170511141515957-772528796.png

Introductions引入

  • 簡介允許一個切面宣告一個實現指定介面的通知物件,並且提供了一個介面實現來代表這些物件
  • 由 aop:aspect 中的 aop:declare-parents 元素宣告該元素用於宣告所匹配的型別擁有一個新的parent
    例如:有個Service提供server服務,想在不更改Service程式碼的前提下對該Service增加驗證,即可以定義一個介面和實現,再通過Introductions為Service增加新的介面,使Service可以通過驗證後再執行server
    Demo:
    宣告一個介面,並提供實現
    692906-20170511152053832-300555623.png
    692906-20170511152100254-829508734.png

想要引入的類
692906-20170511152147176-329340170.png

配置
692906-20170511152333926-185396618.png
Test方法
692906-20170511152442972-850417331.png
執行結果
692906-20170511152550410-1544344264.png

advisor

  • 就像一個小的自包含的方面,只有一個advice
  • 切面自身通過一個bean表示,並且必須實現某個advice介面,同事,advisor也可以很好的利用AspectJ的切入點表示式
  • Spring通過配置檔案中的aop:advisor 元素支援advisor 實際使用中大多數情況下他會和transactional advice配合使用
  • 為了定義一個advisor的優先順序以便讓advice可以有序,可以使用order屬性來定義advisor的順序
    例如:該標籤只是切入的另一種方式,只需要配置切入點和實現了通知介面的類即可實現切面
    Demo:
    配置
    692906-20170511171519582-273433276.png

實現了Advice介面的實現類
692906-20170511170919285-856193234.png
切入點測試呼叫方法
692906-20170511170953785-605362560.png
測試
692906-20170511171007410-304356799.png
結果
692906-20170511171020457-1005977602.png

轉載於:https://www.cnblogs.com/shanelau/p/6831359.html

相關文章