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的編譯器或者織入器