SpringAOP源码学习总结

1.使用@EnableAspectJAutoProxy启用aop
在这里插入图片描述
2.创建abstractAutoProxyCreator
   使用@EnableAspectJAutoProxy后, 可以看到会@Import(AspectJAutoProxyRegistrar.class)
在这里插入图片描述
   AspectJAutoProxyRegistrar将名为“org.springframework.aop.config.internalAutoProxyCreator”的AnnotationAwareAspectJAutoProxyCreator 注册进容器,该proxyCreator是AbstractAdvisorAutoProxyCreator的子类。

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

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

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步的方法执行顺序:
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值