Spring Aop 源码增强获取分享(spring cloud)

网友投稿 277 2022-08-08


Spring Aop 源码增强获取分享(spring cloud)

目录1 前言2 spring 增强器3 总结

1 前言

在前文中,已经讲述了 AOP 的后置处理器使用和方法,在本文中继续分享增强信息相关的源码,这里才是 AOP 的核心代码。

2 spring 增强器

之前已经讲述了 spring AbstractApplicationContext.refresh 方法,在以下方法中都会处理会处理 BeanPostProcessor 接口。

invokeBeanFactoryPostProcessorsregisterBeanPostProcessorsfinishBeanFactoryInitialization

增强器的获取,就是提取 @Aspect 注解标记的内容,这个操作一般是在后置处理器中进行处理,在 refresh 方法中调用 finishBeanFactoryInitialization 步骤中进行实现,最终可以追溯到 AbstractAutoProxyCreator.postProcessAfterInitialization。Spring 容器中注册的 AnnotationAwareAspectJAutoProxyCreator 父类就是 AbstractAutoProxyCreator ,继而调用 postProcessBeforeInstantiation 方法获取代理对象。

在实例化之后,初始化之后会调用 postProcessAfterInitialization 方法,

如下图所示:

如果有 @Aspect 注解的切面,则将通过 AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean 方法进行获取并放入缓存中。

这里的 findCandidateAdvisors 方法的解析和追踪,获取增强器需要追踪 AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors() 方法,其又调用了 BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors() 方法,主要的作用就是为了获取切面逻辑,即获取增强器。

以上是获取增强器的核心逻辑,对于如何解析切面逻辑的注解,则还需要从以下方法进行着手分析,主要就是 getPointcut 方法。

在该方法中,主要实现了以下功能:

1 获取切点的信息,切点信息一般是指获取注解表达式的信息。2 根据切点信息生成增强实现,所有的实现类都由 InstantiationModelAwarePointcutAdvisorImpl 进行统一的封装。

这里的 instantiateAdvice 方法即是获取切面逻辑

invokeAdviceMethod 这个方法就是实际调用的方法。

findCandidateAdvisors 查找所有的增强器的解析,但是对于所有的增强器,不一定能适用于当前 Bean,还需要挑选适合的增强器uhvquxedF,满足配置的通配符的增强器。这就用到了 findAdvisorsThatCanApply。

BeanFactoryAspectJAdvisorsBuilder.buildAspectJAdvisors() 来获取所有的 Advisor。其核心逻辑如下图所示:

1 获取所有的 beanName,这个 Spring 提供了 BeanFactoryUtils.beanNamesForTypeIncludingAncestors 方法来获取容器中所有的 beanName 信息。2 遍历所有的 beanName , 并找出声明有 AspectJ 注解的类。3 对标记为 AspectJ 注解的类进行增强器的提取。4 将提取增强的结果放入 advisorsCache 中。

以上便是获取增强器的全部过程,总结来说 wrapIfNecessary getAdvicesAndAdvisorsForBean buildAspectJAhttp://dvisors 都是核心的方法。

3 总结

本文讲了获取增强信息获取的源码,主要核心方法为wrapIfNecessarygetAdvicesAndAdvisorsForBean buildAspectJAdvisors,在后续文中将继续 AOP 代码的分享。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于Kafka消费者订阅方式
下一篇:深入解析Java类加载的案例与实战教程(Java类加载过程)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~