1、ClassPathXMLApplicationContext初始化的步骤
1)初始化前的准备工作,例如对系统属性或者环境变量进行准备及验证;
2)初始化BeanFactory,并进行XML文件读取;
3)对beanFactory进行各种功能填充;
4)子类覆盖方法做额外的处理;
5)激活各种BeanFactory处理器;
6)注册拦截bean创建的bean处理器;
7)为上下文初始化Message源;
8)初始化应用消息广播器;
9)留给子类来初始化其他的bean;
10)在所有注册的bean中查找listener bean,注册到消息广播器中;
11)初始化剩下的单实例(非惰性的);
12)完成刷新过程。
2、环境准备prepareRefresh
1)initPropertySource正符合Spring的开放式结构设计,给用户最大扩展Spring的能力;
2)validateRequiredProperties则是对属性进行验证。
3、加载BeanFactory
- obtainFreshBeanFactory步骤:
1)创建DefaultListableBeanFactory;
2)指定序列化ID;
3)定制FactoryBean;
4)加载BeanDefinition;
‘5)使用全局变量记录BeanFac
4、功能扩展
- 增加SPEL语言的支持
- 增加属性注册编辑器
- 添加ApplicationContextAwareProcessor处理器
- 设置忽略依赖
- 注册依赖
5、BeanFactory的后处理
- BeanPostProcessor和BeanFactoryPostProcessor:如果你想改变实际的bean实例,那么你最好使用BeanPostProcessor。同样的,BeanFactoryPostProcessor的作用范围是容器级的。
- PropertyPlaceholderConfigurer:PropertyPlaceholderConfigurer间接继承了BeanFactoryPostProssor接口,当Spring加载任何实现了这个接口的bean的配置时,都会在bean工厂载入所有bean的配置之后执行postProcessBeanFactory方法。正是通过事项BeanFactoryPostProcessor接口,BeanFactory会在实例化任何bean之前获得配置信息,从而能够正确解析bean描述文件中的变量引用。
- 激活BeanFactoryPostProcessor:从上面的方法我们可以看到,对于BeanFactoryPostProcessor的处理主要分为两种情况进行,一个是对于BeanDefinitionRegistry类的特殊处理,另一种是对普通的BeanFactoryPostProcessor进行处理。
对于BeanDefinitionRegistry类型的处理类的处理主要包括以下内容:
1)对于硬编码注册的后处理器的处理,主要是通过AbstractApplicationContext中的添加处理器方法addBeanFactoryPostProcessor进行添加;
2)记录后的处理器主要使用3个Lis完成:
a.registryPostProcessors:记录通过硬编码方式注册的BeanDefinitionRegistryPostProcessor类型的处理器;
b.regularPostProcessors:记录通过硬编码方式注册的BeanFactoryPostProcessor类型的处理器;
c.registryPostProcessorBeans:记录通过配置方式注册的BeanDefinitionRegistryPostProcessor类型的处理器。
3)对以上记录的List中的后处理器进行统一调用BeanFactoryPostProcessor的postProcessorBeanFactry方法;
4)对BeanFactoryPostProcessor中非BeanDefinitionRegisrtyPostProcessor类型的后处理器进行统一的BeanFactoryPostProcessor的postProcessorBeanFactory进行调用;
5)普通BeanFactory的处理。
- 注册BeanPostProcessor:
ApplicationContext中添加了自动注册的功能,这个特性是在registerBeanPostProcessor方法中完成的:
1)注册实现所有的PriorityOrdered的BeanPostProcessor;
2)注册实现所有实现Ordered的BeanPostProcessor;
3)注册所有无序的BeanPostProcessor;
4)注册所有MergedBeanDefinitionPostProcessor类型的BeanPostProcessor。
对于BeanFactoryPostProcessor的处理要区分两种情况,一种方式是通过硬编码方式的处理,另一种是通过配置文件方式的处理;而BeanPostProcessor的处理中只考虑了配置文件的方式。因为对于BeanFactoryPostProcessor的处理,不但要实现注册功能,而且还要实现对后处理器的激活操作,所以需要载入配置中的定义,并进行激活;而对于BeanPostProcessor并不需要马上调用,硬编码的方式实现的功能是将后处理器提取并调用。
6、初始化非延迟加载单例
完成BeanFactory的初始化工作,其中包括ConversionService的设置、配置冻结以及费延迟加载的bean的初始化工作。
1)ConversionService的设置:之前我们提到过使用自定义类型转换器从String转换为Date的方式,那么在Spring中还提供了另一种转换方式:使用Converter;
2)冻结配置:冻结所有的bean定义,说明注册的bean定义将不被修改或进行任何进一步的处理;
3)初始化非延迟加载:ApplicationContext实现的默认行为就是在启动时将所有单例bean提前进行实例化。提前实例化意味着作为初始化过程的一部分,ApplicationContext实例会创建并配置所有的单例bean。
7、finishRefresh
在Spring中还提供了Lifecycle接口,LifeCycle中包含了strat/stop方法,实现此接口后Spring会保证在启动的时候调用其start方法开始生命周期,并在Spring关闭的时候调用stop方法来结束生命周期,通常用来配置后台程序,在启动后一直运行(如对MQ进行轮询等):
1)initLifecycleProcessor:当ApplicationContext启动或停止时,它会通过LifecycleProcessor来与所有声明的bean的周期做状态更新,而在LifecycleProcessor的使用前首先需要初始化;
2)onRefresh:启动所有实现了Lifecycle接口的bean;
3)publishEvent:当完成ApplicationContext初始化的时候,要通过Spring中的事件发布机制来发出ContextRefreshedEvent事件,以保证对应的监听器可以做进一步的逻辑处理。