上篇讲到BeanFactory的初始化过程,Spring还提供了另外一种拥有更多扩展功能的容器ApplicationContext。
ApplicationContext比简单BeanFactory多出的功能:
1、支持不同的信息源。通过继承MessageSource接口
2、访问资源。通过继承ResourceLoader,可以从不同地方得到Bean定义资源
3、应用事件。通过继承ApplicationEventPublisher,引入事件机制,方便管理Bean的生命周期
。。
我们以ClassPathXmlApplicationContext为例分析这类容器的初始化过程。
第一步是设置配置文件路径,保存在configLocations属性中。
重点是后面的refresh(),其中逻辑清晰地展示了所有的流程:
1、准备工作
对系统属性和环境属性进行准备和验证
2、初始化BeanFactory,解析容器中的bean
3、对BeanFactory进行各种功能填充
3.1、增加对SPEl语言的支持;
3.2、增加对属性编辑器的支持,如字符串转Date;
3.3、添加ApplicationContextAwareProcessor
为了在实现了EnvironmentAware等接口的bean实例化时取得相应的资源
3.4、设置忽略依赖
将ApplicationContextAwareProcessor涉及到的Aware类在依赖注入的时候忽略
3.5、注册固定依赖
为bean中BeanFactory等属性的注入注册固定的实例
3.6、增加对AspectJ的支持(后续会细说)
3.7、将相关环境变量及属性以单例模式注册
4、允许子类添加自己的BeanPostProcessors
5、激活BeanFactoryPostProcessor
在容器所有bead实例化前对bean配置的元数据进行处理,如PropertyPlaceholderConfigurer实现bean定义中${key}和配置文件的映射
6、注册BeanPostProcessor
7、初始化消息资源,国际化处理
8、初始化应用事件广播器
用于在context.publishEvent时根据事件类型遍历对应的监听器
9、允许子类初始化其他的bean
10、查找并注册事件监听器
11、初始化非延迟加载的单例
12、通知生命周期处理器容器启动完毕,发出ContextRefreshedEvent事件