SpringAop具体流程

本文详细阐述了BeanFactoryAspectJAdvisorsBuilder在Spring框架中的角色,涉及AspectJbean的查找、Advisor的实例化,以及如何与自动代理结合。重点讲解了Advisor应用过程、拦截器顺序和切面执行顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • BeanFactoryAspectJAdvisorsBuilder:用于从BeanFactory检索@AspectJ bean并基于它们构建Spring Advisor的帮助程序,以与自动代理一起使用。

    • buildAspectJAdvisors:在当前的bean工厂中查找带有Aspect注释的aspect bean,然后返回代表它们的Spring AOP Advisor列表。
      1. 先获取到aspectBeanNames,如果为空,则去寻找带有@Aspect注解的bean。
      2. 寻找到带@Aspect的bean后会根据beanType和beanName实例化一个AspectMetadata。(在单例bean的情况下):之后再实例化一个MetadataAwareAspectInstanceFactory,再通过将此factory作为参数调用this.advisorFactory.getAdvisors(factory)
        1. 此步骤会获取到切面类中带有前切后切环切等的方法。
        2. 通过这些方法实例化Advisor(InstantiationModelAwarePointcutAdvisorImpl),然后将实例化好的Advisor存放到List中。
  • 给bean应用BeanPostProcessor的postProcessAfterInitialization时,调用AbstractAutoProxyCreator的postProcessAfterInitialization,然后调用wrapIfNecessary来包装bean。

  • Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);

    • 先寻找到所有的Advisors,然后寻找可以应用给该bean的Advisors。
      1. 首先获取到此Advisor的ClassFilter来与目标类进行匹配,匹配失败则返回false。
      2. 判断是否需要匹配所有方法,是则返回true。
      3. 通过IntroductionAwareMethodMatcher进行方法匹配,成功匹配到一个方法则返回true。
    • 为Advisors链添加一个ExposeInvocationInterceptor作为头部。
    • 将所有的Advisor封装成PartiallyComparableAdvisorHolder进行排序。
  • 创建代理对象:

    • buildAdvisors
      1. 获取到通用拦截器。
      2. 将specificInterceptors和commonInterceptors合在一起。
      3. 将所有的Interceptors适配后返回。
    • 给proxyFactory设置Advisors和TargetSource和Frozen。
    • createAopProxy,cglib是ObjenesisCglibAopProxy,jdk动态代理是JdkDynamicAopProxy。然后再通过创建出来的AopProxy来getProxy就生成了代理对象。
  • 使用代理对象的方法:

    • 调用DynamicAdvisedInterceptor的intercept。

      1. 获取到代理对象代理的目标对象,获取与拦截方法相匹配的InterceptorsAndDynamicInterceptionAdvice。是一条拦截器链,会对拦截器链进行递归调用,直到尾部。也就是调用切面的方法。
    • 执行顺序(多个切面可以用@Order排序,每个切面中的方法按以下顺序执行)

      1. 环绕:

        image-20201006160622740

      2. Before:

        image-20201006160236549

      3. After:

        image-20201006160608379

      4. AfterReturning:

        image-20201006160546994

      5. AfterThrowing:

        image-20201006160500073

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值