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

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方法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值