1.从JDK或者CGLIB动态代理到Spring的动态代理,大家会发现他们的共同点都是编程式的去生成代理对象,通常我们的spring项目中不会直接去使用他们,因为这样使用他们太麻烦,我们希望能直接从Spring容器种拿到代理对象(bean),所以Spring提供了AOP的功能,声明式的指定被代理类和切点,从而通过Spring容器帮你生成代理对象(bean)。
2.Spring的动态代理整合了CGLIB和JDK动态代理,提供了Adivce的概念,一般支持四种advice - beforeAdvice,afterReturningAdvice,afterThrowingAdvice,around。AspectJ多一种advice就是afterAdvice,就是最后finally里面执行。
3.其实Spring的AOP有两种实现
第1种就是Spring的动态代理(再底层也就是JDK和CGLIB)
第2种就是AspectJ - 也是一个项目
第1种都是要通过Spring的一些扩展功能比如FactoryBean,BeanPostProcessor,把代理对象交给Spring管理。
第2种是Spring支持了AspectJ的注解,Spring容器启动的时候会去解析AspectJ的注解例如@Aspect,@Jointpoint。。生成对应的Adivice bean (增强Bean)
但是有个开关@EnableAspectJAutoProxy
4.AspectJ是在编译期增强,意思就是在编译的时候生成代理类
JDK和CGLIB是在运行期增强,意思就是运行时生成代理类