上篇讲到BeanFactory的初始化过程,Spring还提供了另外一种拥有更多扩展功能的容器ApplicationContext。ApplicationContext比简单BeanFactory多出的功能:1、支持不同的信息源。通过继承MessageSource接口2、访问资源。通过继承ResourceLoader,可以从不同地方得到Bean定义资源3、应用事件。通过继承ApplicationEventPublisher,引入事件机制,方便管理Bean的生命周期。。我们以ClassPathXmlApplicationContext为例分析这类容器的初始化过程。第一步是设置配置文件路径,保存在configLocations属性中。重点是后面的refresh(),其中逻辑清晰地展示了所有的流程:1、准备工作对系统属性和环境属性进行准备和验证2、初始化BeanFactory,解析容器中的bean3、对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、允许子类添加自己的BeanPostProcessors5、激活BeanFactoryPostProcessor在容器所有bead实例化前对bean配置的元数据进行处理,如PropertyPlaceholderConfigurer实现bean定义中${key}和配置文件的映射6、注册BeanPostProcessor7、初始化消息资源,国际化处理8、初始化应用事件广播器用于在context.publishEvent时根据事件类型遍历对应的监听器9、允许子类初始化其他的bean10、查找并注册事件监听器11、初始化非延迟加载的单例12、通知生命周期处理器容器启动完毕,发出ContextRefreshedEvent事件