服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Spring Aop 源码增强获取分享

Spring Aop 源码增强获取分享

2022-12-01 16:26斜月 Java教程

这篇文章主要介绍了Spring Aop 源码增强获取分享,文章围绕主题的内容展开Spring Aop的相关介绍,具有一定的参考价值需要的小伙伴可以参考一下

1 前言

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

 

2 spring 增强器

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

  • invokeBeanFactoryPostProcessors
  • registerBeanPostProcessors
  • finishBeanFactoryInitialization

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

Spring Aop 源码增强获取分享

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

如下图所示:

Spring Aop 源码增强获取分享

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

Spring Aop 源码增强获取分享

Spring Aop 源码增强获取分享

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

Spring Aop 源码增强获取分享在这里this.advisorFactory.getAdvisors(factory)是获取增强器的最终实现方法,在ReflectiveAspectJAdvisorFactory工程方法中,可以看到以下内容,这里采用的是委托模式:

Spring Aop 源码增强获取分享

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

Spring Aop 源码增强获取分享

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

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

Spring Aop 源码增强获取分享

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

Spring Aop 源码增强获取分享

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

Spring Aop 源码增强获取分享

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

Spring Aop 源码增强获取分享

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

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

以上便是获取增强器的全部过程,总结来说wrapIfNecessarygetAdvicesAndAdvisorsForBeanbuildAspectJAdvisors都是核心的方法。

 

3 总结

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

到此这篇关于Spring Aop 源码增强获取分享的文章就介绍到这了,更多相关Spring Aop内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7087465088617021448

延伸 · 阅读

精彩推荐