Java的Spring AOP詳細講解

什麼是AOP&作用

  • AOP 為 Aspect Oriented Programming 的縮寫,意思為面向切面編程,是通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。
  • AOP 是 OOP 的延續,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高瞭開發的效率
  • 作用:在程序運行期間,在不修改源碼的情況下對方法進行功能增強

AOP的動態代理技術

  • 常用的動態代理技術

1.JDK代理,基於接口的動態代理

在這裡插入圖片描述

2.cglib代理,基於父類的動態代理技術

在這裡插入圖片描述

基於JDK的動態代理

動態代理的實現

在這裡插入圖片描述

單獨實現增強方法

在這裡插入圖片描述

running方法

在這裡插入圖片描述

cglib動態代理

不需要寫接口文件其他增強方法,目標方法復制

在這裡插入圖片描述

AOP相關概念

Target(目標對象):代理的目標對象

Proxy (代理):一個類被 AOP 織入增強後,就產生一個結果代理類

Joinpoint(連接點):所謂連接點是指那些被攔截到的點。在spring中,這些點指的是方法,因為spring隻支持方法類型的連接點

Pointcut(切入點):所謂切入點是指我們要對哪些 Joinpoint 進行攔截的定義

Advice(通知/ 增強):所謂通知是指攔截到 Joinpoint 之後所要做的事情就是通知

Aspect(切面):是切入點和通知(引介)的結合

Weaving(織入):是指把增強應用到目標對象來創建新的代理對象的過程。spring采用動態代理織入,而AspectJ采用編譯期織入和類裝載期織入

AOP開發明確事項

需要編寫的內容

  • 編寫業務核心代碼(目標方法)
  • 編寫切面類(增強功能方法)
  • 在配置文件中。配置織入關系

AOP技術實現的內容

Spring 框架監控切入點方法的執行。一旦監控到切入點方法被運行,使用代理機制,動態創建目標對象的代理對象,根據通知類別,在代理對象的對應位置,將通知對應的功能織入,完成完整的代碼邏輯運行。

AOP 底層使用哪種代理方式

在 spring 中,框架會根據目標類是否實現瞭接口來決定采用哪種動態代理的方式(jdk是接口代理 cglib是不需要接口的)

基於XML的AOP開發

導入AOP相關坐標

在這裡插入圖片描述

創建目標接口和目標類

在這裡插入圖片描述

在這裡插入圖片描述

創建切面類

在這裡插入圖片描述

將目標類和切面類的對象創建權交給Spring

在applicationContext.xml中配置織入關系

在這裡插入圖片描述

測試代碼

在這裡插入圖片描述

切面表達式

  • 表達式語法

execution([修飾符] 返回值類型 包名.類名.方法名(參數))

execution(public void com.itheima.aop.Target.method())

訪問修飾符可以省略

execution(void com.itheima.aop.Target.*(..))

包名與類名之間一個點 . 代表當前包下的類,兩個點 … 表示當前包及其子包下的類

execution(* com.itheima.aop.*.*(..))

參數列表可以使用兩個點 … 表示任意個數,任意類型的參數列表

execution(* com.itheima.aop..*.*(..))

通知類型

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

切點表達式抽取

在這裡插入圖片描述

基於註解的AOP開發

創建目標接口和目標類(內部有切點)

在這裡插入圖片描述

創建切面類(內部有增強方法)

在這裡插入圖片描述

將目標類和切面類的對象創建權交給Spring 在切面類中使用註解配置織入關系 在配置文件中開啟組件掃描和AOP自動代理

在這裡插入圖片描述

測試

在這裡插入圖片描述

註解通知類型和切面表達式的抽取

類型

在這裡插入圖片描述

在這裡插入圖片描述

抽取表達式

在這裡插入圖片描述

總結

本篇文章就到這裡瞭,希望能夠給你帶來幫助,也希望您能夠多多關註WalkonNet的更多內容!  

推薦閱讀: