spring aop原理解析

   今日一朋友問起aop的原理,便心血來潮寫下了這麼一篇文章

Spring AOP原理

      AOP 代理其實是由 AOP 框架動態生成的一個對象,該對象可作爲目標對象使用。AOP 代理包含了目標對象的全部方法,但 AOP 代理中的方法與目標對象的方法存在差異:AOP 方法在特定切入點添加了增強處理,並回調了目標對象的方法。

AOP 代理所包含的方法與目標對象的方法示意圖如圖 3 所示。

下圖 :AOP 代理的方法與目標對象的方法

圖 3.AOP 代理的方法與目標對象的方法

Spring 的 AOP 代理由 Spring 的 IoC 容器負責生成、管理,其依賴關係也由 IoC 容器負責管理。因此,AOP 代理可以直接使用容器中的其他 Bean 實例作爲目標,這種關係可由 IoC 容器的依賴注入提供。

縱觀 AOP 編程,其中需要程序員參與的只有 3 個部分:

  • 定義普通業務組件。
  • 定義切入點,一個切入點可能橫切多個業務組件。
  • 定義增強處理,增強處理就是在 AOP 框架爲普通業務組件織入的處理動作。

上面 3 個部分的第一個部分是最平常不過的事情,無須額外說明。那麼進行 AOP 編程的關鍵就是定義切入點和定義增強處理。一旦定義了合適的切入點和增強處理,AOP 框架將會自動生成 AOP 代理,而 AOP 代理的方法大致有如下公式:

代理對象的方法 = 增強處理 + 被代理對象的方法

在上面這個業務定義中,不難發現 Spring AOP 的實現原理其實很簡單:AOP 框架負責動態地生成 AOP 代理類,這個代理類的方法則由 Advice 和回調目標對象的方法所組成。

對於前面提到的圖 2 所示的軟件調用結構:當方法 1、方法 2、方法 3 ……都需要去調用某個具有“橫切”性質的方法時,傳統的做法是程序員去手動修改方法 1、方法 2、方法 3 ……、通過代碼來調用這個具有“橫切”性質的方法,但這種做法的可擴展性不好,因爲每次都要改代碼。

於是 AOP 框架出現了,AOP 框架則可以“動態的”生成一個新的代理類,而這個代理類所包含的方法 1、方法 2、方法 3 ……也增加了調用這個具有“橫切”性質的方法——但這種調用由 AOP 框架自動生成的代理類來負責,因此具有了極好的擴展性。程序員無需手動修改方法 1、方法 2、方法 3 的代碼,程序員只要定義切入點即可—— AOP 框架所生成的 AOP 代理類中包含了新的方法 1、訪法 2、方法 3,而 AOP 框架會根據切入點來決定是否要在方法 1、方法 2、方法 3 中回調具有“橫切”性質的方法。

簡而言之:AOP 原理的奧妙就在於動態地生成了代理類,這個代理類實現了圖 2 的調用——這種調用無需程序員修改代碼。接下來介紹的 CGLIB 就是一個代理生成庫,下面介紹如何使用 CGLIB 來生成代理類

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