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