1. 程式人生 > >Spring Bean——理解Bean的生命週期

Spring Bean——理解Bean的生命週期

生命週期圖

在bean準備就緒給我們使用之前,容器默默的執行了很多啟動步驟。Spring提供了BeanFactory作為Spring容器,平常開發中我們常用其派生類ApplicationContext。
儘管BeanFactory和ApplicationContext容器的註冊方式不大一樣(使用BeanFactory要顯示的呼叫其addBeanPostProcessor()方法進行註冊)以及載入bean的時機不一樣(BeanFactory預設採用延遲載入)等,但對於bean的生命週期管控基本一致。
這裡就以ApplicationContext來說。
Bean的完整生命週期可以認為是從容器建立初始化Bean開始,直到Spring容器關閉。
事實上,在Bean被初始化建立之前,容器級別的介面方法也會對Bean產生影響,因此這裡把這兩個事件也加進來了。
在這裡插入圖片描述

一、介面分類:

在以上介面方法中, 可以分為幾類:

1、容器級生命週期介面方法【灰色底色】:
BeanFactoryPostProcessor、BeanPostProcessor和InstantiationAwareBeanPostProcessor。它們都是容器初始化bean時對外暴露的擴充套件點(容器擴充套件點),一般稱它們的實現類為“後置處理器”。(需要將實現這些介面的bean註冊到spring容器中。)然後InstantiationAwareBeanPostProcessor是BeanPostProcessor的子介面,可以在Bean生命週期的另外三個時期提供擴充套件的回撥介面,即例項化Bean之前(呼叫postProcessBeforeInstantiation方法)、給bean注入對應屬性後(呼叫postProcessPropertyValues方法)和例項化Bean之後(呼叫postProcessAfterInstantiation方法)。

2、Bean級生命週期介面方法【淺藍色底色】:
BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean。需要bean繼承介面然後在bean內部實現方法,因此屬於Bean級生命週期介面方法。

3、Bean自身的呼叫方法【淺紅色底色】:
通過配置檔案中的init-method和destroy-method指定的方法。

二、流程簡述

1、[容器級]BeanFactoryPostProcessor介面:如果spring配置檔案註冊了該介面的實現類,可以在spring的bean建立之前,修改bean的定義屬性。例如可以把bean的scope從singleton改為prototype。

2、[容器級]InstantiationAwareBeanPostProcessor介面:初始化Bean之前的預處理;

3、初始化Bean

4、[容器級]InstantiationAwareBeanPostProcessor介面:如果spring配置檔案註冊了該介面的實現類,Spring將呼叫它們的postProcessPropertyValues方法;

5、注入:Spring根據定義資訊(beanDifinition)將值和引用bean注入到bean對應的屬性中;

6、[Bean級]感知類名:如果bean實現了BeanNameAware介面,Spring將bean的ID傳遞給setBeanName()方法;

7、[Bean級]感知容器:如果bean實現了ApplicationContextAware介面,Spring將呼叫setApplicationContext()方法,將bean所在的應用上下文的引用傳入進來。(實用)
注:BeanFactory容器查詢實現了BeanFactoryAware介面,Spring將呼叫setBeanFactory()方法,將BeanFactory容器例項傳入.

8、[容器級]BeanPostProcessor: 如果bean實現了BeanPostProcessor介面,Spring將呼叫它們的postProcessBeforeInitialization()方法;

9、[Bean級]InitializingBean:如果bean實現了InitializingBean介面,Spring將呼叫它們的after-PropertiesSet()方法。

10、[Bean自身方法]init-method:如果bean定義中使用指定了init-method初始化方法,該方法也會被呼叫;

11、[容器級]BeanPostProcessor:如果bean實現了BeanPostProcessor介面,Spring將呼叫它們的postProcessAfterInitialization()方法;

12、[容器級/後處理器]InstantiationAwareBeanPostProcessor :如果bean實現了InstantiationAwareBeanPostProcessor 介面,Spring將呼叫它們的postProcessAfterInitialization()方法;
此時,bean已經準備就緒,可以被應用程式使用了,它們將一直駐留在應用上下文中,直到該應用上下文被銷燬;

13、[Bean級]DisposableBean:如果bean實現了DisposableBean介面,Spring將呼叫它的destroy()介面方法。

14、[Bean自身方法]destroy-method: 如果bean定義中使用destroy-method聲明瞭銷燬方法,該方法也會被呼叫。