SpringBoot refresh() 方法解析

本文详细解读Spring Boot启动过程中的BeanFactory创建、配置、BeanFactoryPostProcessor应用,以及BeanPostProcessor的注册和生命周期管理,揭示核心配置原理。
摘要由CSDN通过智能技术生成

一、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.推送上下文刷新完毕事件到相应的监听器

        

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值