Spring-IOC从ApplicationContext角度看bean的加载流程【三】BeanFactoryPostProcessors与BeanPostProcessors的处理
接着上一篇文章继续分析:
1、postProcessBeanFactory(beanFactory)
在应用程序上下文的标准初始化之后修改其内部bean工厂。所有bean定义都已加载,但还没有实例化bean。这允许在特定的ApplicationContext实现中注册特殊的BeanPostProcessors等。
1 | protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {} |
由子类实现:
2、invokeBeanFactoryPostProcessors(beanFactory)
实例化并调用所有已注册的BeanFactoryPostProcessor bean,如果给定显式顺序,则遵循显式顺序。必须在单例实例化之前调用。
1 | protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { |
3、registerBeanPostProcessors(beanFactory)
实例化并注册所有BeanPostProcessor bean,如果给定则遵循显式顺序。必须在单例实例化之前调用。
1 | protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { |
以上两个方法都调用了类PostProcessorRegistrationDelegate中的方法。
4、PostProcessorRegistrationDelegate
委托AbstractApplicationContext的后处理器处理。
分为两个主要功能:
- 执行BeanFactoryPostProcessor-BeanDefinition的容器级别的后处理器
- 注册BeanPostProcessor-getBean操作获得的对象的后处理器
看一下BeanFactoryPostProcessor与BeanPostProcessor的接口定义:
1 |
|
可以看出BeanFactoryPostProcessor只有一个后置处理,而BeanPostProcessor由前置和后置处理。
BeanFactoryPostProcessor是用于处理BeanDefinition,BeanPostProcessor用于处理bean实例。
BeanFactoryPostProcessor在refresh()方法中被调用,BeanPostProcessor是在获取bean实例的时候调用。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ClawHub的技术分享!