個人學習Spring In Action學習筆記系列 (三) AOP
源碼地址 https://github.com/spring-projects/spring-framework
U4 通知Bean
4.1 AOP簡介
切面有助於實現交叉事務的模塊化,每個模塊是爲特定領域提供服務,比如日誌和安全就是一個交叉事務。
在面向切面編程AOP的思想裏面,核心業務功能和切面功能分別獨立進行開發,然後把切面功能和核心業務功能 "編織" 在一起,這就叫AOP
優點
- 模塊可重用
- 減少了重複代碼
- 讓類着重於其主要功能
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生成代理類的兩種方式
- 如果目標對象是一個接口,使用JDK java.lang.reflect.Proxy類,允許Spring動態生成一個新類來實現必要的接口,織入任何通知,並且這些接口的任何調用都轉發到目標類
- 如果不是一個接口,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
自動代理的兩種方式
- Spring上下文裏面聲明通知者Bean
- 基於@AspectJ 註解切面的自動代理
自動代理@AspectJ切面