Spring Application (Spring 應用程式)啟動過程
Spring應用程式啟動過程:
1. Spring將"bean配置檔案"中的資訊載入到容器的“Bean定義登錄檔(BeanDefinitionRegistry)”中,此時bean還未初始化。
2.呼叫工廠後處理器。 從BeanDefinitionRegistry中找出型別是BeanFactoryPostProcessor的bean,並呼叫其postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法。
3. 註冊“Bean後處理器(BeanPostProcessor)”:從BeanDefinitionRegistry中找到型別是BeanPostProcessor
4. 初始化訊息源
5.初始化應用上下文的事件廣播器
6.初始化其他特殊的bean
7.註冊事件監聽器
8.初始化所有單例項的bean,使用懶漢模式的bean除外:初始化後,將bean放到快取中
9.釋出“上下文重新整理事件”:建立“上下文重新整理事件”,事件廣播器負責將這些事件廣播到每一個註冊的事件監聽器中
從BeanFactory中獲得bean的完整過程:
1. 呼叫beanFactory的getBean(String name)方法
2. 呼叫InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation
3.例項化(根據具體的配置情況呼叫bean的建構函式或者工廠方法來例項化bean)
4.呼叫InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation()方法
這裡可以對已經例項化的bean做些操作
5.呼叫InstantiationAwareBeanPostProcessor的postProcessPropertyValues()方法
6.設定屬性值
如果bean的配置檔案中,對這個bean的屬性做了配置,那這裡就進行這項動作:
具體會呼叫bean的屬性設定方法來設定屬性
7.呼叫BeanNameAware的setBeanName()方法
如果當前bean實現了BeanNameAware介面,則將呼叫setBeanName方法,將配置檔案中該bean的名稱設定到bean中
8.呼叫BeanFactoryAware的setBeanFactory()方法
9.呼叫BeanPostProcessor的Object postProcessBeforeInitialization(Object bean, String beanName)方法
BeanPostProcessor可以用來實現AOP,動態代理等功能
10.呼叫InitializingBean的afterPropertiesSet()方法
11.呼叫init-method屬性配置的初始化方法
12.呼叫BeanPostProcessor的postProcessAfterInitialization()方法
這裡需要判斷是singleton還是prototype了
如果是singleton,則放入spring的singleton快取池中;如果是prototype,則直接將bean交給呼叫者
當容器銷燬時,對於prototype的bean,不用處理;
對於singleton的bean:
13. 呼叫DisposableBean的afterProperitesSet()方法
14. 呼叫destroy-method屬性配置的銷燬方法
ApplicationContext中獲得bean的完整過程:
和上面過程一樣,只是在8步和9步之間增加
呼叫ApplicationContextAware的setApplicationContext()方法
================================
注意這幾個
BeanFactoryPostProcessor beanFactory後處理器
BeanPostProcessor InstantiationAwareBeanPostProcessor
以上兩個是bean後處理器,InstantiationAwareBeanPostProcessor繼承BeanPostProcessor