Spring-AOP和AspectJ的區別和聯絡
阿新 • • 發佈:2018-12-20
AOP是Spring框架的重要組成部分。目前我所接觸的AOP實現框架有Spring AOP還有就是AspectJ(還有另外幾種我沒有接觸過)。我們先來說說他們的區別:
AspectJ是一個比較牛逼的AOP框架,他可以對類的成員變數,方法進行攔截。由於 AspectJ 是 Java 語言語法和語義的擴充套件,所以它提供了自己的一套處理方面的關鍵字。除了包含欄位和方法之外,AspectJ 的方面宣告還包含切入點和通知成員。
Spring AOP依賴的是 Spring 框架方便的、最小化的執行時配置,所以不需要獨立的啟動器。但是,使用這個技術,只能通知從 Spring 框架檢索出的物件。Spring的AOP技術只能是對方法進行攔截。
在spring AOP中我們同樣也可以使用類似AspectJ的註解來實現AOP功能,但是這裡要注意一下,使AspectJ的註解時,AOP的實現方式還是Spring AOP。Spring預設使用J2SE動態代理來作為AOP的代理,這樣任何介面都可以被代理,Spring也可以使用CGLIB代理,對於需要代理類而不是代理介面的時候CGLIB是很有必要的。如果一個業務物件沒有實現介面,預設就會使用CGLIB代理。
Spring AOP和AscpectJ之間的關係:Spring使用了和aspectj一樣的註解,並使用Aspectj來做切入點解析和匹配(AspectJ 5讓第三方使用AspectJ的切入點解析和匹配引擎的工具API)。但是spring AOP執行時仍舊是純的spring AOP,並不依賴於Aspectj的編譯器或者織入器