源码剖析springAOP的执行流程(注解方式启动spring)
程序员文章站
2022-05-19 15:57:20
...
1.源码流程
2.总结
aaa@qq.com开启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,执行所有通知,再执行目标方法,实现代理功能
上一篇: PHP以CGI方式和服务器上嵌入模块方式有什么区别?
下一篇: 生成验证码