refresh()中的invokeBeanFactoryPostProcessors(beanFactory)
![](https://img-blog.csdnimg.cn/4fffdb43c3294f94b48c68e22502b261.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
invokeBeanFactoryPostProcessors(),实例化并且调用所有已经注册了的beanFactoryPostProcessor,遵循指明的顺序
![](https://img-blog.csdnimg.cn/99cb020946224f9695bd49d958466253.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(),获取到当前应用程序上下文的beanFactoryPostProcessors变量的值,并且实例化调用执行所有已经注册的beanFactoryPostProcessor,通过getBeanFactoryPostProcessors()来获取已经注册的BFPP
invokeBeanFactoryPostProcessors()执行流程:
外部集合: getBeanFactoryPostProcessors()获取已经注册的BFPP
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())
子类:BeanDefinitionRegistryPostProcessor增强的是BeanDefinition,自己有postProcessBeanDefinitionRegistry()方法,也有父类的postProcessBeanFactory()方法
父类:BeanFactoryPostProcessor增强的是BeanFactory里面所有的对象,postProcessBeanFactory()方法![](https://img-blog.csdnimg.cn/3793dd6fd09341e1a524c6dfb5878f9c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/a7c2f0c41e28404fac4cd33d9e1d1288.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/e73f44f285e74e5e9961f2caa2ff5477.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
![](https://img-blog.csdnimg.cn/584a439e45964078a945dea4fae6aded.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
先处理外部集合的BeanFactoryPostProcessor,就是入参中的beanFactoryPostProcessors
1、遍历所有的beanFactoryPostProcessors,将BeanDefinitionRegistryPostProcessor和BeanFactoryPostProcessor区分开
2、如果是BeanDefinitionRegistryPostProcessor,直接执行BeanDefinitionRegistryPostProcessor接口中的postProcessBeanDefinitionRegistry方法,然后添加到registryProcessors,用于后续执行postProcessBeanFactory方法,
3、否则,只是普通的BeanFactoryPostProcessor,添加到regularPostProcessors,用于后续执行postProcessBeanFactory方法。
![](https://img-blog.csdnimg.cn/8f10b8e835e4428faf3a780c29b5cb8d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
在调用所有实现PriorityOrdered接口的BeanDefinitionRegistryPostProcessor实现类
1、找到所有实现BeanDefinitionRegistryPostProcessor接口bean的beanName
2、遍历处理所有符合规则的postProcessorNames,检测是否实现了PriorityOrdered接口,获取名字对应的bean实例,添加到currentRegistryProcessors中,将要被执行的BFPP名称添加到processedBeans,避免后续重复执行
3、按照优先级进行排序操作,添加到registryProcessors中,用于最后执行postProcessBeanFactory方法,遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法
4、执行完毕之后,清空currentRegistryProcessors
![](https://img-blog.csdnimg.cn/4c9474c96e26495b9b3d0a11a9c93b56.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
调用所有实现Ordered接口的BeanDefinitionRegistryPostProcessor实现类
1、找到所有实现BeanDefinitionRegistryPostProcessor接口bean的beanName,重复查找的原因在于上面的执行过程中可能会新增其他的BeanDefinitionRegistryPostProcessor
2、 检测是否实现了Ordered接口,并且还未执行过,获取名字对应的bean实例,添加到currentRegistryProcessors中,将要被执行的BFPP名称添加到processedBeans,避免后续重复执行
3、按照优先级进行排序操作, 添加到registryProcessors中,用于最后执行postProcessBeanFactory方法,遍历currentRegistryProcessors,执行postProcessBeanDefinitionRegistry方法
4、执行完毕之后,清空currentRegistryProcessors
![](https://img-blog.csdnimg.cn/13b4456807e847c4a2d5a4a77cdeb463.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
然后调用所有剩下没有排序优先级的BeanDefinitionRegistryPostProcessors,逻辑跟上方差不多。
最后调用所有BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法以及调用入参beanFactoryPostProcessors中的普通BeanFactoryPostProcessor的postProcessBeanFactory方法
以上代码入参beanFactoryPostProcessors和容器中的所有BeanDefinitionRegistryPostProcessor已经全部处理完毕,下面开始处理容器中 所有的BeanFactoryPostProcessor,可能会包含一些实现类,只实现了BeanFactoryPostProcessor,并没有实现BeanDefinitionRegistryPostProcessor接口。
![](https://img-blog.csdnimg.cn/5297710268674b14bd4b25826c8ec06e.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
找到所有实现BeanFactoryPostProcessor接口的类,遍历postProcessorNames,将BeanFactoryPostProcessor按实现PriorityOrdered、实现Ordered接口、普通三种区分开
![](https://img-blog.csdnimg.cn/fa95025af1114ffe99bf1f1e6d6830a1.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
对实现了PriorityOrdered、Ordered接口以及没有排序普通的BeanFactoryPostProcessor进行排序,各自遍历BeanFactoryPostProcessor,执行postProcessBeanFactory方法
拓展1:
添加自定义BeanFactoryPostProcessor,让Spring识别的2种方式
![](https://img-blog.csdnimg.cn/e5c03fcba9784a618462316c2d3e6e13.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
1.在配置文件添加
2.在自定义的MyClassPathXmlApplicationContext,重写方法里面调用addBeanFactoryPostProcessor()
![](https://img-blog.csdnimg.cn/347c56d459e64f8699e5dc4264ddb872.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
拓展2:
在BeanDefinitionRegistryPostProcessor执行过程中添加其他的BeanDefinitionRegistryPostProcessor
在MyBeanDefinitionRegistryPostProcessor执行过程中添加MySelfBeanDefinitionRegistryPostProcessor
1.MySelfBeanDefinitionRegistryPostProcessor
![](https://img-blog.csdnimg.cn/266304b4c9474949a8cc895c558586f6.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
2.MyBeanDefinitionRegistryPostProcessor
![](https://img-blog.csdnimg.cn/85fea65116ad44ebb3bad5697a5b8524.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbG9ja2V0,size_20,color_FFFFFF,t_70,g_se,x_16)
3.applicationContext.xml
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)