1、prepareRefresh();
-
这一步创建和准备了 Environment 对象,它作为 ApplicationContext 的一个成员变量
-
Environment 对象的作用之一是为后续 @Value,值注入时提供键值
-
Environment 分成三个主要部分
-
systemProperties - 保存 java 环境键值
-
systemEnvironment - 保存系统环境键值
-
自定义 PropertySource - 保存自定义键值,例如来自于 *.properties 文件的键值
@Value中$和#的区别
2、obtainFreshBeanFactory()
-
这一步获取(或创建) BeanFactory,它也是作为 ApplicationContext 的一个成员变量
-
BeanFactory 的作用是负责 bean 的创建、依赖注入和初始化,bean 的各项特征由 BeanDefinition 定义
-
BeanDefinition 作为 bean 的设计蓝图,规定了 bean 的特征,如单例多例、依赖关系、初始销毁方法等
-
BeanDefinition 的来源有多种多样,可以是通过 xml 获得、配置类获得、组件扫描获得,也可以是编程添加
-
所有的 BeanDefinition 会存入 BeanFactory 中的 beanDefinitionMap 集合
3、prepareBeanFactory(beanFactory);
配置标准的BeanFactory,设置ClassLoader,设置SpEL表达式解析器,添加忽略注入的接口,添加bean,添加bean后置处理器等
-
这一步会进一步完善 BeanFactory,为它的各项成员变量赋值
-
beanExpressionResolver 用来解析 SpEL,常见实现为 StandardBeanExpressionResolver
-
propertyEditorRegistrars 会注册类型转换器
-
它在这里使用了 ResourceEditorRegistrar 实现类
-
并应用 ApplicationContext 提供的 Environment 完成 ${ } 解析
-
registerResolvableDependency 来注册 beanFactory 以及 ApplicationContext,让它们也能用于依赖注入
-
beanPostProcessors 是 bean 后处理器集合,会工作在 bean 的生命周期各个阶段,此处会添加两个:
-
ApplicationContextAwareProcessor 用来解析 Aware 接口
-
ApplicationListenerDetector 用来识别容器中 ApplicationListener 类型的 bean
4、postProcessBeanFactory(beanFactory);
模板方法,此时,所有的beanDefinition已经加载,但是还没有实例化。
允许在子类中对BeanFactory进行扩展处理。比如添加ware相关接口自动装配设置,添加后置处理器等,是子类扩展prepareBeanFactory(beanFactory)的方法
5、invokeBeanFactoryPostProcessors(beanFactory);
实例化并调用所有注册的BeanFactory后置处理器(实现接口BeanFactoryPostProcessor
的bean,在beanFactory标准初始化之后执行)。
例如:
@Bean
@Configuration
@PropertySource – 加载配置文件,并将其进行解析
@ConfigurationProperties - 将已经解析好的配置文件中的属性,赋值到该被Spring管理的类中 @PropertySource 等注解都是由Bean工厂的后处理器解析的。
6、registerBeanPostProcessors(beanFactory);
实例化和注册beanFactory中扩展了BeanPostProcessor
的bean。
例如:
AutowiredAnnotationBeanPostProcessor
(处理被@Autowired
注解修饰的bean并注入)
RequiredAnnotationBeanPostProcessor
(处理被@Required
注解修饰的方法)
CommonAnnotationBeanPostProcessor
(处理@PreDestroy
、@PostConstruct
、@Resource
等多个注解的作用)等。方法11会用到
2-6都是准备BeanFactory的步骤
7、initMessageSource();
回到ApplicationContext中 初始化国际化工具类MessageSource
8、initApplicationEventMulticaster();
初始化事件广播器,事件发布器
9、onRefresh();
模板方法,在容器刷新的时候可以自定义逻辑,不同的Spring容器做不同的事情。
10、registerListeners();
注册监听器,广播early application events
11、finishBeanFactoryInitialization(beanFactory);
实例化所有剩余的(非懒加载)单例
比如invokeBeanFactoryPostProcessors方法中根据各种注解解析出来的类,在这个时候都会被初始化。
实例化的过程各种BeanPostProcessor开始起作用。
12、finishRefresh();
refresh做完之后需要做的其他事情。
清除上下文资源缓存(如扫描中的ASM元数据)
初始化上下文的生命周期处理器,并刷新(找出Spring容器中实现了Lifecycle
接口的bean并执行start()方法)。
发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作