Spring In Action 學習筆記(三) AOP

個人學習Spring In Action學習筆記系列 (三) AOP

源碼地址 https://github.com/spring-projects/spring-framework


U4 通知Bean

4.1 AOP簡介

切面有助於實現交叉事務的模塊化,每個模塊是爲特定領域提供服務,比如日誌和安全就是一個交叉事務。

在面向切面編程AOP的思想裏面,核心業務功能和切面功能分別獨立進行開發,然後把切面功能和核心業務功能 "編織" 在一起,這就叫AOP

優點

  1. 模塊可重用
  2. 減少了重複代碼
  3. 讓類着重於其主要功能

4.1.1 定義AOP術語

  •     切入點(Pointcut) 在哪些類,哪些方法上切入(where
  •     通知(Advice) 在方法執行的什麼實際(**when:**方法前/方法後/方法前後)做什麼(**what:**增強的功能)
  •     切面(Aspect) 切面 = 切入點 + 通知,通俗點就是:在什麼時機,什麼地方,做什麼增強!
  •     織入(Weaving) 把切面加入到對象,並創建出代理對象的過程。(由 Spring 來完成

織入 在目標對象的多個生命週期都可以發生織入過程

  • 編譯時 切面在目標類編譯時被織入。需要特殊的編譯期,AspectJ
  • 類加載時 切面在目標類加載到JVM時被織入。需要特殊的ClassLoader
  • 運行時 切面在程序運行的某個時刻被織入,AOP會動態創建一個代理對象來委託給目標對象。這就是Spring AOP的織入切面方式

Spring利用代理類包裹切面,從而把他們織入到Spring管理的Bean裏代理類裝作目標Bean,截取被通知的方法調用,再把這些調用轉發到真正的目標Bean

Spring只支持方法連接點

Spring生成代理類的兩種方式

  1. 如果目標對象是一個接口,使用JDK java.lang.reflect.Proxy類,允許Spring動態生成一個新類來實現必要的接口,織入任何通知,並且這些接口的任何調用都轉發到目標類
  2. 如果不是一個接口,Spring就使用CGLIB庫生成目標類的一個子類

4.2 創建典型的Spring切面

4.2.1 創建通知

4.2.2 定義切點和通知者

連接點就是程序代碼中切面通知可以被織入的地點,切點是以某種方式選擇全部連接點的一個子集來定義通知應該被織入的地點

Spring AOP中通知者把通知切點關聯起來,從而完整地定義了一個切面

4.2.3 使用ProxyFactoryBean

作爲被通知者通知的Bean,它必須是被代理的。Spring的ProxyFactoryBean是個工廠Bean用於生產一個代理

4.3 自動代理

ProxyFactoryBean會讓Spring配置文件變得冗長,需要爲每個被通知的Bean聲明兩個Bean:目標Bean 代理Bean

自動代理的兩種方式

  1. Spring上下文裏面聲明通知者Bean
  2. 基於@AspectJ 註解切面的自動代理

自動代理@AspectJ切面

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