上篇講到BeanFactory的初始化過程,Spring還提供了另一種擁有更多擴展功能的容器ApplicationContext。
ApplicationContext比簡單BeanFactory多出的功能:
一、支持不一樣的信息源。經過繼承MessageSource接口
二、訪問資源。經過繼承ResourceLoader,能夠從不一樣地方獲得Bean定義資源
三、應用事件。經過繼承ApplicationEventPublisher,引入事件機制,方便管理Bean的生命週期
。。編輯器
咱們以ClassPathXmlApplicationContext爲例分析這類容器的初始化過程。
第一步是設置配置文件路徑,保存在configLocations屬性中。
重點是後面的refresh(),其中邏輯清晰地展現了全部的流程:
一、準備工做
對系統屬性和環境屬性進行準備和驗證
二、初始化BeanFactory,解析容器中的bean
三、對BeanFactory進行各類功能填充
3.一、增長對SPEl語言的支持;
3.二、增長對屬性編輯器的支持,如字符串轉Date;
3.三、添加ApplicationContextAwareProcessor
爲了在實現了EnvironmentAware等接口的bean實例化時取得相應的資源
3.四、設置忽略依賴
將ApplicationContextAwareProcessor涉及到的Aware類在依賴注入的時候忽略
3.五、註冊固定依賴
爲bean中BeanFactory等屬性的注入註冊固定的實例
3.六、增長對AspectJ的支持(後續會細說)
3.七、將相關環境變量及屬性以單例模式註冊
四、容許子類添加本身的BeanPostProcessors
五、激活BeanFactoryPostProcessor
在容器全部bead實例化前對bean配置的元數據進行處理,如PropertyPlaceholderConfigurer實現bean定義中${key}和配置文件的映射
六、註冊BeanPostProcessor
七、初始化消息資源,國際化處理
八、初始化應用事件廣播器
用於在context.publishEvent時根據事件類型遍歷對應的監聽器
九、容許子類初始化其餘的bean
十、查找並註冊事件監聽器
十一、初始化非延遲加載的單例
十二、通知生命週期處理器容器啓動完畢,發出ContextRefreshedEvent事件繼承