1.源码流程
扫描二维码关注公众号,回复:
11205530 查看本文章
2.总结
1.@EnableAspectJAutoProxy开启aop
2.底层是将AspectJAutoProxyRegistrar注入spring容器
3.AspectJAutoProxyRegistrar通过AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry)的底层
registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source)
将AnnotationAwareAspectJAutoProxyCreator注入spring容器
4.AnnotationAwareAspectJAutoProxyCreator是BeanPostProcessor的子类,也是AOP的入口
5.AnnotationAwareAspectJAutoProxyCreator的上级中AbstractAutoProxyCreator为AOP的核心类
6.AbstractAutoProxyCreator重新了后置处理方法postProcessAfterInitialization,其中通过wrapIfNecessary创建代理
7.Object proxy = createProxy(
bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
8.层层包装调用,进入到DefaultAopProxyFactory的createAopProxy方法创建代理
9.创建代理时判断目标对象是否实现接口,是则使用JDK的动态代理,否则使用CGLIB的动态代理
10.在JDK的动态代理的类JdkDynamicAopProxy中,可看到其中invoke方法实现代理功能
11.List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);获取aop的所有通知
12.使用责任链模式执行所有通知,执行目标方法
13.当我们在调用getBean去实例化springbean时,安装springbean的生命周期,在执行完bean自定义的init方法后,进入后置处理
这时就会创建代理类,当bean执行方法时,进入代理类的invoke,执行所有通知,再执行目标方法,实现代理功能