Spring AOP與Java動態代理

 

AOP爲Aspect Oriented Programming的縮寫,意爲:面向切面編程,可以實現在不修改源代碼的情況下給程序動態同意添加功能的一種技術。作爲面向對象編程的一種補充,專門用於處理系統中分佈於各個模塊(不同方法)中的交叉關注點的問題,在 Java EE 應用中,常常通過 AOP 來處理一些具有橫切性質的系統級服務,如事務管理、安全檢查、緩存、對象池管理等。AOP 實現的關鍵就在於 AOP 框架自動創建的 AOP 代理,AOP 代理主要分爲靜態代理和動態代理兩大類,靜態代理以 AspectJ 爲代表;而動態代理則以 Spring AOP 爲代表。

Spring AOP 是通過Java動態代理的方式實現,而Java動態代理有JDK動態代理和CGLib動態代理兩種方式。Spring AOP會根據情況選擇使用哪一種動態代理方式,或者由用戶強制指定。

  • 使用JDK動態代理實現Spring AOP

一旦我們給一個Bean定義了Aop, 使用Spring容器的getBean方法獲得的對象就是Jdk動態代理生成的代理類的對象。如下類圖,Spring實現了自己的攔截器JdkDynamicAopProxy,並覆蓋了invoke方法,在invoke方法會調用相應的Advisor處理程序,當然最終會調用到目標對象的方法。我們可以看到在JdkDynamicAopProxy中聚合了AdvisedSupport類,在AdvisedSupport類中可以看到有targetObject屬性,這個是目標對象;還有一個advisorChainFactory, 這個是advisor鏈的工廠類,通過這個類可以獲得advisor鏈。AOP-JDK-Proxy_thumb2

  • 使用CGLib動態代理實現Spring AOP

一旦我們給一個Bean定義了Aop,使用Spring容器的getBean方法獲得的對象就是CGLib動態代理生成的代理類。如下類圖,Spring定義自己的攔截器Cglib2AopProxy$DynamicAdvisedInterceptor。和Jdk動態代理類似,在攔截器中聚合了AdvisedSupport類。

CGLib-Proxy-AOP_thumb2

  • Spring AOP選擇動態代理方式的策略

—先嚐試使用JDK 動態代理(Bean的類必須實現了接口)

Spring AOP這個策略是可以理解的,因爲使用JDK動態代理,就不需要依賴第三方庫,所以優先選擇Jdk動態代理。

—如果Bean的類沒有實現接口,則默認使用CGLib Proxies

–可以通過設置proxy-target-class強制使用CGLib Proxies

<aop:config proxy-target-class="true">

<!-- other beans defined here... -->

</aop:config>

發佈了28 篇原創文章 · 獲贊 16 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章