SpringAOP源码学习总结

版权声明:转载请声明转自http://blog.csdn.net/thewindkee https://blog.csdn.net/thewindkee/article/details/85693237

1.使用@EnableAspectJAutoProxy启用aop
在这里插入图片描述
2.创建abstractAutoProxyCreator
使用@EnableAspectJAutoProxy后, 可以看到会@Import(AspectJAutoProxyRegistrar.class)

初始化Spring容器的时候会在registerBeanPostProcessors() 遍历实现ordered接口的beanPostProcessors的时候getBean(AspectJAwareAdvisorAutoProxyCreator). 此处成功创建了AspectJAwareAdvisorAutoProxyCreator 。该proxyCreator 是一个abstractAutoProxyCreator的子类,是beanPostProcessor的实现. 会在initializeBean的时候被触发,用于创建代理对象。

3.创建advistor(切面)到缓存
preInstantiateSingletons()阶段, 在处理internalEventListenerProcessor的时候,createBean>resolveBeforeInstantiation>applyBeanPostProcessorsBeforeInstantiation,之前创建的proxyCreator会作为其postBeanProssor,postProcessBeforeInstantiation(),获取所有@AspectJ , 并将advisors添加到缓存①。(ps:猜想此处并不一定需要该listerner来触发。 只是第一次触发后之后直接取了缓存而已)

4.生成代理对象
当使用了@Aspect拦截后
在这里插入图片描述

context.getBean(bean)的时候会触发doCreateBean>initializeBean>applyBeanPostProcessorsBeforeInstantiation>BeanPostProcessor.postProcessBeforeInstantiation() 此处BeanPostProcessor 指的之前的proxyCreator, 会把①处获得的所有advisors通过canApply过滤, 如果剩有advisors 就说明需要使用createProxy创建代理对象,接下来就是通过jdk/cglib创建代理对象并返回。

5.调用advice链
当代理对象调用方法的时候, 代理对象执行intercept,通过 List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass)得到advice链,该chain 是一个倒序的chain.将chain传入new CglibMethodInvocation(proxy, target, method, args, targetClass, chain, methodProxy).proceed();创建一个invocation去执行,这里是用到责任链模式,顺序如下:
在这里插入图片描述

1-4步的方法执行顺序:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/thewindkee/article/details/85693237