AOP是Spring框架的重要組成部分。目前我所接觸的AOP實現框架有Spring AOP還有就是AspectJ(還有另外幾種我沒有接觸過)。咱們先來講說他們的區別:spring
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的編譯器或者織入器對象