Spring AOP 原理篇

以前在 Spring AOP 應用篇,講述了 AOP 的使用,這一篇來說一些 Spring AOP的實現原理。java

Spring 主要經過兩種技術來實現 AOP,Java 動態代理CGLib 動態代理設計模式

Java 動態代理

因爲知識點比較多,單獨寫來一篇文章,參考 設計模式之動態代理框架

CGLib 動態代理

參考 CGLib 動態代理工具

Spring AOP 的選擇策略

既然有兩種技術能夠實現,那麼實際運用時,到底選擇的是哪種呢?post

默認的選擇策略是性能

  • 若是目標類實現了接口,則選擇 java動態代理技術
  • 若是目標類沒有實現了接口,則選擇CGLib 動態代理,前提是目標類沒有被 final 修飾

多個 AOP 做用到同一個目標類時的執行順序

實際應用中常常遇到這樣的狀況,那麼這多個AOP的執行順序是怎麼樣的呢,答案是鏈式調用設計

番外

Aspectj

在使用 Spring AOP 的過程當中,咱們常常用的 Aspectj的註解。好比 @Aspect、@Pointcut、@Before、@After等代理

哪一個這個 Aspectj 是什麼呢接口

Aspectj 也是一個 AOP 框架,與 Spring AOP不一樣的是,它不是經過動態代理實現的。而是在編譯時,就把代理方法植入到目標方法中get

  • 因爲是靜態織入的,因此性能相對來講比較好
  • 因爲是靜態織因此也不受類的限制,無論是private、或者static、或者final的,無論有沒有接口均可以代理
  • Aspectj不會代理除了限定方法以外任何其餘諸如toString()等方法

Spring AOP 與 Aspectj 的關係

Spring AOP 雖然引用了Aspectj的一些核心概念,好比Aspect、advice、joinpoint等,也使用了AspectJ中的一些註解。好比@pointCut、@after、@before等。

但Spring AOP 並非 Aspectj,它不會向 Aspectj同樣,在編譯時,就把代理方法植入到目標方法中。它只是用了一些 Aspectj的工具,並對java動態代理和CGLIB代理作了一層封裝,因此實際上Spring AOP和Aspectj的關係並不大

相關文章
相關標籤/搜索