
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.扫尾工作,如清理缓存、初始化生命周期处理器,发布容器刷新事件