Spring AOP原理

Spring AOP 原理

aop:面向切面(方面)編程,

擴展功能不修改源代碼實現

AOP 機制

採用橫向抽取機制,取代原來的縱向抽取機制

縱向抽取機制
縱向抽取機制

* 橫向抽取機制*
橫向抽取機制

aop底層使用動態代理實現

(1)第一種情況,有接口情況,使用動態代理創建接口實現類代理對象 (jdk動態代理)
(2)第二種情況,沒有接口情況,使用動態代理創建類的子類代理對象 (cglib 動態代理)

AOP 常見術語

  • 連接點 : 類中的哪些方法可被增強,這些方法稱之爲連接點
  • 切入點: 類中很多方法可以被增強,實際增強的方法稱之爲切入點
  • 通知: 增強的邏輯,比如擴展的日誌功能,事務等功能
    前置通知 before:方法執行之前執行
    後置通知 after:方法執行之後執行,不論方法是否執行成功
    環繞通知 around :方法執行之前和之後執行,相當於將切點的執行放入到這個環繞通知中,由其決定是否執行以及執行前後的操作

    另外常見一個新的類進行執行
    // 執行之前的操作
    jointpoint.proceed();
    // 執行之後的操作

    異常通知 after-throwing:方法拋出異常之後執行
    最終通知 after-returning:方法執行成功之後調用通知
  • 切面:把增強(通知)應用到具體的方法上面的過程稱爲切面
  • 織入:把切面應用到目標對象來創建新的代理對象的過程
  • 引入: 允許我們 向現有的類添加新的屬性或者方法

AspectJ 進行AOP的配置

基於aspectj的xml 配置

1 切入點:實際增強的方法

2 常用的表達式
execution(<訪問修飾符>?<返回類型><方法名>(<參數>)<異常>)
(1)切入點爲 book類中的 add 方法—–execution(* cn.itcast.aop.Book.add(..))
(2)切入點爲book類中的所有方法—–execution(* cn.itcast.aop.Book.*(..))
(3)切入點爲所有的方法——-execution(* .(..))
(4)切入點爲匹配所有save開頭的方法 execution(* save*(..))

<!-- 1  配置對象 -->
<bean id="book" class="cn.itcast.aop.Book"></bean>
<bean id="myBook" class="cn.itcast.aop.MyBook"></bean>

<!-- 2 配置aop操作 -->
<aop:config>
  <!-- 2.1 配置切入點 -->
  <aop:pointcut expression="execution(* cn.itcast.aop.Book.*(..))" id="pointcut1"/>

  <!-- 2.2 配置切面
    把增強用到方法上面,ref爲實際增強方法所在的類
  -->
  <aop:aspect ref="myBook">
    <!-- 配置增強類型
      method: 增強類裏面使用哪個方法作爲前置
    -->
    <aop:before method="before1" pointcut-ref="pointcut1"/>

    <aop:after-returning method="after1" pointcut-ref="pointcut1"/>

    <aop:around method="around1" pointcut-ref="pointcut1"/>
  </aop:aspect>
</aop:config>

基於AspectJ的註解配置


說明: 本文大部分內容都是跟隨者傳播智課的教學視頻學習而來,可以看做是翻譯文章,只是自己吸收之後又書寫一遍,加深自己的知識理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章