直接上圖吧。這是SpringIOC容器創建的整個過程
總共有12大步。設計者採用了模板方法模式,把這個12步固定寫了下來,在一個抽象的容器裏(AbstractApplicationContext),具體容器必須繼承這個類來實現一些空的模板方法。
從spring IOC容器整個創建過程可以看出Spring給我們提供了兩大利器來對程序進行擴展。所謂的容器本質就是一個ConcurrentHashMap來保存着創建好的單實例Bean。
1. PostProcessor
提供了若干後置處理器接口來對工廠以及Bean創建前後進行攔截,IOC刷新流程是一個完整的模板,spring後面大部分功能都是基於後置處理器來實現的。下面列出幾個關鍵的後置處理器
1)BeanFactoryPostProcessor在工廠標準初始化之後,尚未創建對象前,對工廠進行後置處理工作。
2)BeanDefinitionRegistryPostProcessor繼承了BeanFactoryPostProcessor,提供了postProcessBeanDefinitionRegistry方法讓我們可以動態的添加Bean定義信息。
3) BeanPostProcessor 接口是在Bean創建對象之後,初始化前後進行攔截。
4) InstanationAwareBeanPostProcessor 接口繼承了BeanPostProcessor接口,可以在bean創建對象前後進行攔截
以上四個後置處理器的調用順序是:
BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry ->
BeanDefinitionRegistryPostProcessor.postProcessBeanFactory ->
BeanFactoryPostProcessor.postProcessBeanFactory ->
InstanationAwareBeanPostProcessor.postProcessBeforeInstanation ->
constructor.newInstance()創建Bean實例 ->
InstanationAwareBeanPostProcessor.postProcessAfterInstanation ->
bean實例設置屬性值 ->
BeanPostProcessor.postProcessBeforeInitialization ->
調用bean初始化方法
BeanPostProcessor.postProcessAfterInitialization
2.事件驅動
Spring容器給我們創建了一個事件派發器,通過調用IOC容器的pushEvent方法,就可以給實現了ApplicationListener接口的事件監聽器派發事件