Spring注解学习_AOP原理2_注册AnnotationAwareAspectJAutoProxyCreator的过程

  1. 注册后置处理器AnnotationAwareAspectJAutoProxyCreator的过程

注册后置处理器AnnotationAwareAspectJAutoProxyCreator的过程

AnnotationAwareAspectJAutoProxyCreator自身也是一个后置处理器,从容器启动到AnnotationAwareAspectJAutoProxyCreator被注册到容器的全过程如下:

  1. 代创建ioc容器,通过构造参数形式传入配置类

  2. 注册配置类,调用refresh()方法刷新容器

  3. refresh()中调用registerBeanPostProcessors( beanFactory ) :注册bean后置处理器来拦截bean的创建,我们看看registerBeanPostProcessors 方法的具体流程:

    • 先获取ioc容器中 已定义了的 需要创建的 所有BeanPostProcessor
      image-20200405223243171

    • 后置处理器信息中就包括了我们之前讲的 “internalAutoProxyCreator”:AnnotationAwareAspectJAutoProxyCreator

    • 后续还会给容器中加上一些其他的BeanPostProcessor:
      image-20200405225436094

    • 之后在根据BeanPostProcessor的优先级,将它们添加到相应优先级的ArrayList当中(其中PriorityOrdered、Ordered都为空接口,优先级:PriorityOrdered>Ordered>普通)

      image-20200405225924696

    • 然后就是注册BeanPostProcessor:优先注册实现了PriorityOrdered接口的BeanPostProcessor,然后是实现了Ordered接口的,最后是没有实现优先级接口的BeanPostProcessor

    • 注册BeanPostProcessor,实际就是创建BeanPostProcessor对象,保存在容器中。其中包括本次分析的目标对象:AnnotationAwareAspectJAutoProxyCreator

      后置处理器本身也是Bean,注册到容器的流程和普通Bean一样:

      • 创建Bean实例

      • populateBean( beanName, mbd, instanceWrapper ); 给Bean的各种属性赋值

      • initializeBean 初始化Bean

        • invokeAwareMethod() : 处理Aware接口的方法回调
        • applyBeanPostProcessorsBeforeInitialization() : 应用后置处理器的初始化前处理
        • invokeInitMethods() : 执行自定义的初始化方法
        • applyBeanPostProcessorsAfterInitialization() : 应用后置处理器的初始化后处理
      • BeanPostProcessor【AnnotationAwareAspectJAutoProxyCreator】创建成功,且由于实现了BeanFactoryAware接口,其setBeanFactory方法被调用,(此方法会调用initBeanFactory,进而创建新的ReflectiveAspectJAdvisorFactory对象。)

        image-20200405235608372

      • 把BeanPostProcessor注册到BeanFactory中:beanFactory.addBeanPostProcessor( postProcessor );

    以后任何组件在创建Bean实例的时候,AnnotationAwareAspectJAutoProxyCreator 就可以其后置处理器的身份拦截到这些Bean的创建过程。

  4. finishBeanFactoryInitialization( beanFactory ) ; 完成BeanFactory的初始化工作,创建剩下的单实例Bean

    AnnotationAwareAspectJAutoProxyCreator会在所有Bean创建之前进行拦截,它实现了InstantiationAwareBeanPostProcessor接口,会调用postProcessBeforeInstantiation方法】

    • 遍历获取容器中所有的beanDefinition,依次创建对象getBean( beanName )

      getBean() --调用–> doGetBean() --调用–> getSingleton() : 先检查有无已创建单实例,有则直接获取,无则创建。只要创建好的Bean都会被缓存起来

    • 通过AbstractAutowireCapableBeanFactory类下的:createBean() 创建Bean,流程为:

      • resolveBeforeInstantiation(beanName, mbdToUse);

        在doCreateBean()之前会给后置处理器们一次机会,希望返回代理对象,若有代理对象则视为成功创建Bean,返回该代理对象。

        • 后置处理器先尝试返回对象
          bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);

          image-20200406021131709

          拿到所有的后置处理器,如果是InstantiationAwareBeanPostProcessor,就该执行后置处理器的 postProcessBeforeInstantiation(beanClass, beanName) 方法

          image-20200406021341685

          AnnotationAwareAspectJAutoProxyCreator正是InstantiationAwareBeanPostProcessor ,故此方法生效。

        • postProcessBeforeInstantiation(beanClass, beanName)

      • doCreateBean(beanName, mbdToUse, args):就是Bean的创建流程——创建Bean实例,赋值,初始化(执行Aware接口方法,后置处理器们的初始化前处理,初始化方法,后置处理器们的初始化后处理)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达,邮件至 708801794@qq.com

文章标题:Spring注解学习_AOP原理2_注册AnnotationAwareAspectJAutoProxyCreator的过程

文章字数:754

本文作者:梅罢葛

发布时间:2020-04-06, 22:30:25

最后更新:2020-04-06, 22:35:23

原始链接:https://qiurungeng.github.io/2020/04/06/Spring%E6%B3%A8%E8%A7%A3%E5%AD%A6%E4%B9%A0-AOP%E5%8E%9F%E7%90%862-%E6%B3%A8%E5%86%8CAnnotationAwareAspectJAutoProxyCreator%E7%9A%84%E8%BF%87%E7%A8%8B/
目录
×

喜欢就点赞,疼爱就打赏