Spring Aop 源码增强获取分享

 更新时间:2022年05月05日 11:24:44   作者:​ 斜月   ​  
这篇文章主要介绍了Spring Aop 源码增强获取分享,文章围绕主题的内容展开Spring Aop的相关介绍,具有一定的参考价值需要的小伙伴可以参考一下

1 前言

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

2 spring 增强器

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

  • invokeBeanFactoryPostProcessors
  • registerBeanPostProcessors
  • finishBeanFactoryInitialization

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

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

如下图所示:

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

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

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

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

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

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

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

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

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

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

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

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

3 总结

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

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

相关文章

  • Spring boot配置文件加解密详解

    Spring boot配置文件加解密详解

    这篇文章主要给大家介绍了关于Spring boot配置文件加解密的相关资料,文中通过示例代码以及图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • Java框架Quartz中的Trigger简析

    Java框架Quartz中的Trigger简析

    这篇文章主要介绍了Java框架Quartz中的Trigger简析,所有类型的trigger都有TriggerKey这个属性,表示trigger的身份;除此之外,trigger还有很多其它的公共属性,这些属性,在构建trigger的时候可以通过TriggerBuilder设置,需要的朋友可以参考下
    2023-11-11
  • Java枚举类型与泛型使用解读

    Java枚举类型与泛型使用解读

    这篇文章主要介绍了Java枚举类型与泛型使用解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 使用Spring自定义命名空间

    使用Spring自定义命名空间

    这篇文章主要介绍了使用Spring自定义命名空间方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java enum的用法详细介绍及实例代码

    Java enum的用法详细介绍及实例代码

    这篇文章主要介绍了Java enum的用法详细介绍及实例代码的相关资料,需要的朋友可以参考下
    2017-02-02
  • SpringBoot整合Shiro思路(最新超详细)

    SpringBoot整合Shiro思路(最新超详细)

    这篇文章主要介绍了SpringBoot整合Shiro思路(最新超详细),本文内容比较长,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • VSCode+Gradle搭建Java开发环境实现

    VSCode+Gradle搭建Java开发环境实现

    这篇文章主要介绍了VSCode+Gradle搭建Java开发环境实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • java制作专属智能陪聊机器人详解

    java制作专属智能陪聊机器人详解

    人工智能一直是最近的热点话题,,这篇文章主要为大家详细介绍了java实现智能陪聊机器人,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java工程如何打印程序日志过程解析

    Java工程如何打印程序日志过程解析

    这篇文章主要介绍了Java工程如何打印程序日志过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 基于Mybatis实现CRUD操作过程解析(xml方式)

    基于Mybatis实现CRUD操作过程解析(xml方式)

    这篇文章主要介绍了基于Mybatis实现CRUD操作过程解析(xml方式),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11

最新评论