Spring 之Aop增强

       有了Ioc基础之后,Aop理解起来会轻松许多。Aop是在CreateBean的阶段对目标Bean的方法进行增强。

1.创建切面并注册到容器(切面不需要被增强)

    createBean --> resolveBeforeInstantiation --> applyBeanPostProcessorsBeforeInstantiation -->

postProcessBeforeInstantiation --> shouldSkip --> findCandidateAdvisors --> buildAspectJAdvisors

依赖关系

这个过程发生在 BeanFactoryAspectJAdvisorsBuilder 该类为 AnnotationAwareAspectJAutoProxyCreator 的一个属性,它会遍历容器中所有的Bean,找到所有的切面类,找到所有的通知并用map缓存起来。由于,AnnotationAwareAspectJAutoProxyCreator 是Ordered的实例,该后置处理器会在第二梯队对Bean的实例化进行修饰。

遍历后置处理器,并应用postProcessBeforeInstantiation(),其中与Aop相关的核心处理器是AnnotationAwareAspectJAutoProxyCreator 这个类实现了SmartInstantiationAwareBeanPostProcessor,他会找到所有Bean中那些事切面类,原理就是判断Bean上面是否带有@Aspect注解,而Aspect本身并不能由Spring容器管理,所以还需要给切面类接上@Component注解。

2.创建Aop增强类

follow the trace  createBean --> resolveBeforeInstantiation -->  applyBeanPostProcessorsAfterInitialization --> wrapIfNecessary

applyBeanPostProcessorsAfterInitialization 会调用 applyBeanPostProcessorsBeforeInstantiation前面解析好的切面和通知用于在此处增强。

getAdvicesAndAdvisorsForBean //获取到前面解析出来的advice
createProxy --> 创建proxyFactory --> proxyFactory.getProxy(getProxyClassLoader())

一路跟进去就会来到真正创建代理的方法中

DefaultAopProxyFactory

 由于没有接口,无法满足jdk动态代理,此处会使用cglib代理。生成了代理类,当调用原始类的方法的时候就会用代理类的业务去代替原始方法的逻辑

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值