Spring启动流程(二)

refresh

此方法是最重要的方法,就是初始化bean工厂和实例化bean,因为我们前面只是将内置bean和配置bean注册到了工厂中,还没有对工厂中其他的属性进行配置,并且还没有注册自定义bean。

1.设置容器启动时间 容器正在运行中 日志运行中
初始化属性资源:自行扩展实现 可以自定义一个applicationcontext 重写该方法
创建环境变量并验证属性集合
创建刷新前的监听器集合<springboot有对应的实现>和监听事件集合

2.刷新beanFactory setSerializationId指定序列化id

org.springframework.beans.factory.support.DefaultListableBeanFactory

3.给beanFactory设置具体属性值

ignoreDependencyInterface忽略给定接口的自动装配功能(忽略该接口实现类中存在依赖外部的bean属性注入)

registerResolvableDependency 例如BeanFactory有很多接口实现,autowired时指定默认的实现

addBeanPostProcessor 向beanFactory中添加两个bean后置处理器

-   List<BeanFactoryPostProcessor>是AbstractApplicationContext中的属性,List<BeanPostProcessor>是AbstractBeanFactory类中的属性

5\.  字面意思:调用所有的bean工厂后置处理器,即BeanFactoryPostProcessor ,
        它的作用是在spring加载bean生成BeanDefinition后,在放入beanFactory前我们可以自定义一些操作。

主要方法:PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors());

this.getBeanFactoryPostProcessors()它里面的处理器需要手动添加,而不是spring扫描的,
只有通过annotationConfigApplicationContext.addBeanFactoryPostProcessor(XXX)才会有数据。

invokeBeanFactoryPostProcessors遍历执行BeanFactoryPostProcessor 。

注意: BeanFactoryPostProcessor 又有一个子接口 BeanDefinitionRegistryPostProcessor ,
前者会把 ConfigurableListableBeanFactory 暴露给我们使用,
后者会把 BeanDefinitionRegistry 注册器暴露给我们使用,看下图。

其中BeanDefinitionRegistry提供了一些操作BeanDefinition的抽象方法,有被BeanFactory和ApplicationContext实现,其主要目的还是操作Map<String, BeanDefinition> beanDefinitionMap。

Spring 中的同类型组件是允许我们控制顺序的,比如在 AOP 中我们常用的 @Order 注解。
这里的 BeanFactoryPostProcessor 接口当然也是提供了顺序,最先被执行的是实现了 PriorityOrdered 接口的实现类,
然后再到实现了 Ordered 接口的实现类,最后就是剩下来的常规 BeanFactoryPostProcessor 类。

首先会回调BeanDefinitionRegistryPostProcessor类中的 postProcessBeanDefinitionRegistry() 方法,
然后再回调BeanFactoryPostProcessor 类中的 postProcessBeanFactory() 方法。

6.字面意思:向容器中注入 BeanPostProcessor,BeanPostProcessor的作用是:
    在 Spring 初始化 bean 的流程中做一些操作,比如完成代理、自动注入、循环依赖等各种功能。

主要方法:PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);

11.实例化所有的单例bean

主要方法:beanFactory.preInstantiateSingletons()

代码中有用到FactoryBean,引出一个问题:FactoryBean和BeanFactory区别。

[Spring中BeanFactory与FactoryBean的区别](https://juejin.cn/post/6844903967600836621)

12.扫尾工作,如清理缓存、初始化生命周期处理器,发布容器刷新事件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值