一、prepareRefresh()
进行刷新前配置
二、ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
获取beanFactory实例
三、prepareBeanFactory(beanFactory)
1、对BeanFactory进项参数设置,设置class加载器,设置El表达式解析器等等。
2、忽略一些借口的自动装配功能
例如EmbeddedValueResolverAware、ResourceLoaderAware等等作用:在Spring自动装配的时候如果一个接口有多个实现类,并且都已经放到IOC中了, 那么自动装配的时候就会出异常,因为spring不知道把哪个实现类注入进去,但是如果我们自定义一个类,然后实现BeanFactoryPostProcessor接口,在该阶段调用这个方法,如果哪个地方要自动注入这个类型的对象的话,那么就注入进去。
四、postProcessBeanFactory
ServletContextAwareProcessor
五、invokeBeanFactoryPostProcessors(
1.getBeanFactoryPostProcessors(): 拿到当前应用上下文beanFactoryPostProcessors变量中的值
// 2.invokeBeanFactoryPostProcessors: 实例化并调用所有已注册的BeanFactoryPostProcessor
1、有两个变量
普通的BeanFactoryPostProcessor
List<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>();
特别的BeanFactoryPostProcessor
List<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>();
2、多次调用invokeBeanDefinitionRegistryPostProcessors,防止操作过程中新增了BeanFactoryProcessor
3、获取实现了BeanDefinitionRegistryPostProcessor接口的对象,分别获取类型为Ordered.class的和PriorityOrdered的,然后调用postProcessBeanDefinitionRegistry()方法,
4、获取普通的BeanFactoryPostProcessor的beanName
5、然后最后遍历nonOrderedPostProcessors,orderedPostProcessors,priorityOrderedPostProcessors,调用postProcessBeanFactory()方法。
六、registerBeanPostProcessors()
遍历实现BeanFactoryProcessor的处理器,将其分别假如第五点提及到的三个Processors,然后调用registerBeanPostProcessors()方法。
registerBeanPostProcessors方法中,
for (BeanPostProcessor postProcessor : postProcessors) {
beanFactory.addBeanPostProcessor(postProcessor);
}
addBeanPostProcessor() 中做了以下事情,
public void addBeanPostProcessor(BeanPostProcessor beanPostProcessor) {
Assert.notNull(beanPostProcessor, "BeanPostProcessor must not be null");
// Remove from old position, if any
this.beanPostProcessors.remove(beanPostProcessor);
// Track whether it is instantiation/destruction aware
if (beanPostProcessor instanceof InstantiationAwareBeanPostProcessor) {
this.hasInstantiationAwareBeanPostProcessors = true;
}
if (beanPostProcessor instanceof DestructionAwareBeanPostProcessor) {
this.hasDestructionAwareBeanPostProcessors = true;
}
// Add to end of list
this.beanPostProcessors.add(beanPostProcessor);
}
七、initMessageSource()
给其中的参数赋值。
八、registerListeners()
注册监听事件,使用事件广播器,发布早期用用程序事件到相应的监听器
九、finishRefresh()
1.为此上下文初始化生命周期处理器,
2.首先将刷新完毕事件传播到生命周期处理器
3.推送上下文刷新完毕事件到相应的监听器
本文详细解读Spring Boot启动过程中的BeanFactory创建、配置、BeanFactoryPostProcessor应用,以及BeanPostProcessor的注册和生命周期管理,揭示核心配置原理。

687

被折叠的 条评论
为什么被折叠?



