天天看點

Spring注解的學習(二)——生命周期一.建立二.初始化&&銷毀 三.從Spring源碼看Bean部分生命周期四.最後

前言:Bean的生命周期主要是:建立——初始化——銷毀

一.建立

對象的建立,主要分為兩種情況。

1.單執行個體:在容器啟動的時候建立對象

2.多執行個體:在每次擷取的時候建立對象

這個xml和注解的不同在上一篇文章講過,這裡就不再描述。對于注解方式,是用@Scope

二.初始化&&銷毀

原來我們是在xml對應的bean上加入 init-method  和 destroy-method 

對于注解的,我們有一下幾種方法

1.在@bean上注解初始化和銷毀方法

@bean(initMethod=”指定初始化方法”,destoryMethod=”指定銷毀方法”)

Spring注解的學習(二)——生命周期一.建立二.初始化&&銷毀 三.從Spring源碼看Bean部分生命周期四.最後
Spring注解的學習(二)——生命周期一.建立二.初始化&&銷毀 三.從Spring源碼看Bean部分生命周期四.最後

這裡應該注意:對于銷毀方法,單例對象,容器關閉的時候調用銷毀方法。對于多執行個體對象,容器不會管理這個bean,不會代用銷毀方法

2.實作了InitializingBean,DisposableBean兩個類中的方法。注意對于多例,容器一樣不管理bean

Spring注解的學習(二)——生命周期一.建立二.初始化&&銷毀 三.從Spring源碼看Bean部分生命周期四.最後

[email protected] :在bean建立并完成屬性指派,來執行初始化方法

  @PreDestroy:在容器銷毀bean之前通知我們進行清理

Spring注解的學習(二)——生命周期一.建立二.初始化&&銷毀 三.從Spring源碼看Bean部分生命周期四.最後

4.實作MyBeanPostProcessor 接口。這裡要注意,該類必須是元件,然後被掃描注入。

方法分别是對象初始化前後,這個要差別上面是初始化和銷毀方法。且對于整個項目的所有Bean對象都有用,在bean對象構造方法執行後,初始化方法執行前執行postProcessBeforeInitialization方法,在初始化方法後執行postProcessAfterInitialization方法。而且注意的時候初始化前的方法必須有傳回,否則初始化後方法無法執行,具體原因下次探讨,應該是參數的問題。且這兩個方法的參數分别是加載的bean對象以及對應的bean名稱

Spring注解的學習(二)——生命周期一.建立二.初始化&&銷毀 三.從Spring源碼看Bean部分生命周期四.最後

.到這裡,我們就一個Bean的生命周期我們就基本上了解了。

首先我們使用構造方法建立一個Bean對象,然後在初始化前可以使用postProcessBeforeInitialization方法,初始化的時候我們可以自定義函數,在初始化後我們可以使用postProcessAfterInitialization方法,然後我們也可以再銷毀的時候定義方法。

三.從Spring源碼看Bean部分生命周期

這個主要是在實作了MyBeanPostProcessor 接口類的兩個方法debug。然後檢視方法棧

可以看出,先執行populateBean方法,進行屬性的配置,然後執行initalizeBean 初始化屬性

Spring注解的學習(二)——生命周期一.建立二.初始化&&銷毀 三.從Spring源碼看Bean部分生命周期四.最後

initializeBean方法:在初始化屬性中,我們先執行postProcessBeforeInitialization再執行初始化方法,最後執行postProcessAfterInitialization方法

Spring注解的學習(二)——生命周期一.建立二.初始化&&銷毀 三.從Spring源碼看Bean部分生命周期四.最後

這裡要注意的是: 對于postProcessBeforeInitialization方法

周遊得到容器中所有的BeanPostProcessor;挨個執行beforeInitialization,

 一但傳回null,跳出for循環,不會執行後面的BeanPostProcessor.postProcessorsBeforeInitialization。

Spring注解的學習(二)——生命周期一.建立二.初始化&&銷毀 三.從Spring源碼看Bean部分生命周期四.最後

我猜想上面我們自定義postProcessBeforeInitialization方法傳回null。導緻後面postProcessAfterInitialization方法無法執行。這個可以debug進去看看,自定義的postProcessBeforeInitialization傳回空的話,你會發現方法棧根本不會執行postProcessAfterInitialization方法

四.最後

這裡有個比較重要的概念:就是

 Spring底層對 BeanPostProcessor 的使用;

 bean指派,注入其他元件,@Autowired,生命周期注解功能,@Async,xxx BeanPostProcessor;