xxApplicationContext 上下文,持有xxBeanFactory 的引用,bean相关操作委托给容器。
xxBeanFactory 真正的容器,
关键词: SmartInitializingSingleton
1.准备
从spring.factory文件中获取ApplicationContextInitializer、与SpringApplicationRunListener并初始化;
new SpringApplicationRunListeners事件发布器,发布starting事件;
新建容器(ConfigurableApplicationContext)。
2.准备容器
1.设置容器ConfigurableApplicationContext的环境、资源加载器、类加载器等
向beanFactory提前注入bean
执行ApplicationContextInitializer来设置ConfigurableApplicationContext
listeners.contextPrepared(context);
2.加载
listeners.contextLoaded(context);
3.刷新容器
spring refresh
1.获取容器beanFactory
2.准备容器:配置bean后置处理器、忽略项等
3.执行beanFactory后置处理器
目的是往beanFactory注册bean的定义(ConfigurationClassPostProcessor 解析@Configuration、@Bean,@Component,@ComponentScan,@Import,@ImportResource等注解,将这些bean的定义注入beanFactory;以及其它功能:配置bean后置处理器、忽略项等)。这些beanFactory后置处理器,有的来自:springBoot读取spring.factory的ApplicationContextInitializer项,这些ApplicationContextInitializer会被执行initialize方法,初始化ConfigurableApplicationContext容器,其中就包含配置新的bean后置处理器;有的来自spring中实现了BeanFactoryPostProcessor接口的bean。
4.配置BeanPostProcessor类型的bean到beanFactory容器
5.配置applicationEventMulticaster事件广播器到beanFactory容器
6.初始化web容器
7.注入监听器,发布arlyApplicationEvents事件
7.1 springboot启动时,配置到springApplication容器的监听器。读取spring.factory文件中的ApplicationListener项,实例化得到
7.2 类型是ApplicationListener类型的bean
8.完成所有剩余bean的注入
9.finishRefresh
清理resource缓存、执行bean(所有实现了Lifecycle接口的)的生命周期方法start()、发布ContextRefreshedEvent事件、清理其它缓存