前面写了四篇ioc容器的初始化过程,这篇文章就对ioc容器初始化做个总结:
Spring ioc容器创建过程(1)BeanFactory初始化
spring ioc容器创建过程(2)invokeBeanFactoryPostProcessors
spring ioc容器创建过程(3)registerBeanPostProcessors
spring ioc容器创建过程(4)事件广播与注册监听
一、spring ioc 创建总览
整体初始化代码:
public void refresh() throws BeansException , IllegalStateException {
synchronized (this. startupShutdownMonitor) {
//准备刷新的上下文环境
prepareRefresh() ;
//初始化BeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory() ;
//对BeanFactory 进行各种功能填充
prepareBeanFactory(beanFactory) ;
try {
//子类覆盖方法做额外的处理
postProcessBeanFactory(beanFactory) ;
//激活各种BeanFactory 处理器
invokeBeanFactoryPostProcessors(beanFactory) ;
//注册拦截Bean 后置处理器, 这里只是注册,真正的调用是在getBean的时候
registerBeanPostProcessors(beanFactory);
//为上下文初始化Message 源, 即不同语言的消息体, 国际化处理
initMessageSource();
//初始化应用消息广播器, 并放入applicationEventMulticaster中
initApplicationEventMulticaster();
//留给子类来初始化其它的Bean
onRefresh();
//在所有注册的bean中查找Listenerbean ,注册到消息广播中
registerListeners();
//初始化剩下的单实例(非惰性的)
finishBeanFactoryinitialization(beanFactory);
//完成refresh,同时发出ContextRefreshEvent 通知别人
finishRefresh() ;
catch (BeansException ex) {
destroyBeans();
cancelRefresh(ex) ,
throw ex;
}
}
画了个整体的流程图:
二、BeanFactory和ApplicationContext
可以看到AbstractApplicationContext#refresh()的第一步就是初始化BeanFactory。在Spring 中, BeanFactory 接口的各种实现负责bean实例化,为Spring 管理的bean提供
依赖注入和生命周期支持。
作为BeanFactory 接口的扩展, ApplicationContext 还提供其他有用的功能。
使用ApplicationContext 的最大好处是,它允许以完全声明的方式配置和管理Spring 以及Spring 所管理的资源。这意味着Spring 尽可能提供支持类来自动将ApplicationContext 加载到应用程序中,从而不需要编写任何代码来访问ApplicationContext。
相比BeanFactory,AbstractApplicationContext 增加了过久啊,事件广播等功能,AbstractApplicationContext内建可查找的依赖:
Bean 名称Bean 实例 使用场景environment Environment 对象 外部化配置以及ProfilessystemProperties java.util.Properties 对象 Java 系统属性systemEnvironment java.util.Map 对象 操作系统环境变量messageSource MessageSource 对象国际化文案lifecycleProcessor LifecycleProcessor 对象 Lifecycle Bean 处理器applicationEventMulticaster ApplicationEventMulticaster 对 象 Spring 事件广播器
Bean 名称 | Bean 实例 | 使用场景 |
---|---|---|
environment | Environment 对象 | 外部化配置以及Profiles |
systemProperties | java.util.Properties | 对象 Java 系统属性 |
systemEnvironment | java.util.Map 对象 | 操作系统环境变量 |
messageSource | MessageSource 对象 | 国际化文案 |
applicationEventMulticaster | ApplicationEventMulticaster 对 象 | Spring 事件广播器 |
lifecycleProcessor | LifecycleProcessor 对象 | Lifecycle Bean 处理器 |
三、初始化DefaultListableBeanFactory
为什么在AbstractApplicationContext中初始化的的BeanFactory是DefaultListableBeanFactory
DefaultListableBeanFactory继承了多种BeanFactory:
- HierarchicalBeanFactory接口是在继承BeanFactory的基础上,实现BeanFactory的父子关系。
- AutowireCapableBeanFactory接口是在继承BeanFactory的基础上,实现Bean的自动装配功能
- ListableBeanFactory接口是在继承BeanFactory的基础上,实现Bean的list集合操作功能
- ConfigurableBeanFactory接口是在继承HierarchicalBeanFactory的基础上,实现BeanFactory的全部配置管理功能,SingletonBeanRegistry是单例bean的注册接口。
- ConfigurableListableBeanFactory接口是继承AutowireCapableBeanFactory,ListableBeanFactory,ConfigurableBeanFactory三个接口的一个综合接口
可以看到DefaultListableBeanFactory可以满足大部分使用BeanFactory的场景了。
四、总结:
下面概括一下CApplicationContext 初始化的步骤:
- 初始化前的准备工作,例如对系统属性或者环境变量进行准备及验证。
- 初始化BeanFactory,并进行XML 文件读取。
ApplicationContext 包含着BeanFactory 所提供的一切特征,在这一步骤中将会复用BeanFactory 中的配置文件读取解析及其他功能,这一步之后,lApplicationContext 实际上就已经包含了BeanFactory 所提供的功能,也就是可以进行bean 的提取等基础操作了。 - 对BeanFactory 进行各种功能填充。
@Qualifier 与@Autowired 应该是大家非常熟悉的注解,那么这两个注解正是在这一步骤中增加的支持。 - 子类覆盖方法做额外的处理。
- 激活各种BeanFactory 处理器。
- 注册拦截bean 创建的bean 处理器,这里只是注册, 真正的调用是在getBean时候。
7 .对不同语言的消息体进行国际化处理。 - 初始化应用消息广播器,并放入“applicationEventMulticaster” bean 中。
- 留给子类来初始化其他的bean。
- 在所有注册的bean 中查找listenerbean , 注册到消息广播器中。
- 初始化剩下的单实例。
- 完成刷新过程,通知生命周期处理器lifecycleProcessor 刷新过程,同时发出ContextRefreshEvent通知别人。