1.從JDK或者CGLIB動態(tài)代理到Spring的動態(tài)代理,大家會發(fā)現(xiàn)他們的共同點都是編程式的去生成代理對象,通常我們的spring項目中不會直接去使用他們,因為這樣使用他們太麻煩,我們希望能直接從Spring容器種拿到代理對象(bean),所以Spring提供了AOP的功能,聲明式的指定被代理類和切點,從而通過Spring容器幫你生成代理對象(bean)。
2.Spring的動態(tài)代理整合了CGLIB和JDK動態(tài)代理,提供了Adivce的概念,一般支持四種advice - beforeAdvice,afterReturningAdvice,afterThrowingAdvice,around。AspectJ多一種advice就是afterAdvice,就是最后finally里面執(zhí)行。
3.其實Spring的AOP有兩種實現(xiàn)
第1種就是Spring的動態(tài)代理(再底層也就是JDK和CGLIB)
第2種就是AspectJ - 也是一個項目
第1種都是要通過Spring的一些擴(kuò)展功能比如FactoryBean,BeanPostProcessor,把代理對象交給Spring管理。
第2種是Spring支持了AspectJ的注解,Spring容器啟動的時候會去解析AspectJ的注解例如@Aspect,@Jointpoint。。生成對應(yīng)的Adivice? bean (增強(qiáng)Bean)
但是有個開關(guān)@EnableAspectJAutoProxy
4.AspectJ是在編譯期增強(qiáng),意思就是在編譯的時候生成代理類
? ?JDK和CGLIB是在運(yùn)行期增強(qiáng),意思就是運(yùn)行時生成代理類