0
点赞
收藏
分享

微信扫一扫

Spring注解驱动开发学习总结19:Spring容器创建 - beanFactory后置处理器的操作步骤

杨沐涵 2022-04-21 阅读 25
spring

Spring注解驱动开发学习总结19:Spring容器创建 - beanFactory后置处理器的操作步骤

回顾前1篇文章:
1、Spring注解驱动开发学习总结18:Spring容器创建 - beanFactory创建和预准备工作步骤
分析了Spring容器refresh方法的:
1)刷新前的容器准备:prepareRefresh();
2)刷新内置的bean工厂:obtainFreshBeanFactory();
3)bean工厂的预处理工作:prepareBeanFactory(beanFactory);
4)bean工厂创建并预备好以后的后置处理工作:postProcessBeanFactory(beanFactory);

本文接着继续分析refresh方法

1、查看Spring容器的refresh方法

前面已经分析了refresh方法1-4的步骤,接下来继续分析
1、在512行,刷新前的容器准备:prepareRefresh()
2、在515行,刷新内置的bean工厂:obtainFreshBeanFactory()
3、在518行,bean工厂的预处理工作:prepareBeanFactory(beanFactory);
4、在522行,bean工厂创建并预备好以后的后置处理工作:postProcessBeanFactory(beanFactory);
5、在525行,执行beanFactory的后置处理器工作:invokeBeanFactoryPostProcessors(beanFactory);
在这里插入图片描述

分析步骤5中的invokeBeanFactoryPostProcessors方法

5、执行beanFactory的后置处理器工作:invokeBeanFactoryPostProcessors
  分析invokeBeanFactoryPostProcessors方法
  5.1 在58行,先判断beanFactory是否是BeanDefinitionRegistry类型的
    如果是的话
    5.1.1 在63-68行,获取所有的后置处理器postProcessor,
      如果是BeanDefinitionRegistryPostProcessor类型的,
      就执行它的postProcessBeanDefinitionRegistry方法。
    5.1.2 在81-83,86,92行,获取所有BeanDefinitionRegistryPostProcessor类型的后置处理
      器,如果实现了PriorityOrdered优先级接口,
      则执行它的postProcessBeanDefinitionRegistry方法
    5.1.3 在95-96,98-99,105行,获取所有BeanDefinitionRegistryPostProcessor类型的后置处
      理器,如果实现了Ordered顺序接口,
      则执行它的postProcessBeanDefinitionRegistry方法
    5.1.4 在112,114-115,122行,获取所有BeanDefinitionRegistryPostProcessor类型的后置
      处理器,如果既没有实现PriorityOrdered优先级接口,也没有实现Ordered顺序接口,
      最终也执行它postProcessBeanDefinitionRegistry方法
    如果不是的话
    5.1.5 在131-133行,执行invokeBeanFactoryPostProcessors方法。该方法在283行,会执
      行所有后置处理器的postProcessBeanFactory方法
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
接着分析invokeBeanFactoryPostProcessors方法
5、执行beanFactory的后置处理器工作:invokeBeanFactoryPostProcessors
  分析invokeBeanFactoryPostProcessors方法
  5.1 在58行,先判断beanFactory是否是BeanDefinitionRegistry类型的,然后做相应步骤
  5.2 在138-139行,获取所有类型为BeanFactoryPostProcessor类型的后置处理器
  5.3 在147-158,如果之前已处理过,即BeanDefinitionRegistryPostProcessor类型的,5.1中已
    操作过,直接跳过。否则:
    如果实现了PriorityOrdered优先级接口,则放入priorityOrderedPostProcessors;
    如果实现了orderedPostProcessorNames顺序接口,则放入
    orderedPostProcessorNames;其余的放入nonOrderedPostProcessorNames。
  5.4 在163,171,178行,分别按顺序执行priorityOrderedPostProcessors、
    orderedPostProcessorNames、nonOrderedPostProcessorNames中后置处理器的
    postProcessBeanFactory方法
在这里插入图片描述
在这里插入图片描述

2、小结

上一篇文章分析了refresh方法1-4的步骤,本文分析了refresh方法中的第5步:执行beanFactory的后置处理器工作
查看Spring容器的refresh方法
1、在512行,刷新前的容器准备:prepareRefresh()
2、在515行,刷新内置的bean工厂:obtainFreshBeanFactory()
3、在518行,bean工厂的预处理工作:prepareBeanFactory(beanFactory);
4、在522行,bean工厂创建并预备好以后的后置处理工作:postProcessBeanFactory(beanFactory);
5、在525行,执行beanFactory的后置处理器工作:invokeBeanFactoryPostProcessors(beanFactory)。
  第5步主要是执行了后置处理器的postProcessBeanDefinitionRegistry方法和postProcessBeanFactory方法。
  5.1 在58行,先判断beanFactory是否是BeanDefinitionRegistry类型的
    如果是的话
    5.1.1 在63-68行,获取所有的后置处理器postProcessor,如果是BeanDefinitionRegistryPostProcessor类型的,就
      执行它的postProcessBeanDefinitionRegistry方法。
    5.1.2 在81-83,86,92行,获取所有BeanDefinitionRegistryPostProcessor类型的后置处理器,如果实现了
      PriorityOrdered优先级接口,则执行它的postProcessBeanDefinitionRegistry方法
    5.1.3 在95-96,98-99,105行,获取所有BeanDefinitionRegistryPostProcessor类型的后置处理器,如果实现了
      Ordered顺序接口,则执行它的postProcessBeanDefinitionRegistry方法
    5.1.4 在112,114-115,122行,获取所有BeanDefinitionRegistryPostProcessor类型的后置处理器,如果既没有实现
      PriorityOrdered优先级接口,也没有实现Ordered顺序接口,最终也执行它postProcessBeanDefinitionRegistry
      方法
    如果不是的话
    5.1.5 在131-133行,执行invokeBeanFactoryPostProcessors方法。该方法在283行,会执行所有后置处理器的
      postProcessBeanFactory方法
  5.2 在138-139行,获取所有类型为BeanFactoryPostProcessor类型的后置处理器
  5.3 在147-158,如果之前已处理过,即BeanDefinitionRegistryPostProcessor类型的,5.1中已操作过,直接跳过。否则
    如果实现了PriorityOrdered优先级接口,则放入priorityOrderedPostProcessors;
    如果实现了orderedPostProcessorNames顺序接口,则放入orderedPostProcessorNames;
    其余的放入nonOrderedPostProcessorNames。
  5.4 在163,171,178行,分别按顺序执行priorityOrderedPostProcessors、orderedPostProcessorNames、
    nonOrderedPostProcessorNames中后置处理器的postProcessBeanFactory方法

举报

相关推荐

后置处理器AOP总结

0 条评论