1. 程式人生 > >Spring Application (Spring 應用程式)啟動過程

Spring Application (Spring 應用程式)啟動過程

Spring應用程式啟動過程:

1. Spring將"bean配置檔案"中的資訊載入到容器的“Bean定義登錄檔(BeanDefinitionRegistry)”中,此時bean還未初始化。

2.呼叫工廠後處理器。 從BeanDefinitionRegistry中找出型別是BeanFactoryPostProcessor的bean,並呼叫其postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)方法。

3. 註冊“Bean後處理器(BeanPostProcessor)”:從BeanDefinitionRegistry中找到型別是BeanPostProcessor

的bean,並將這些bean註冊到“bean後處理器的登錄檔”中

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.呼叫BeanPostProcessorObject 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