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