Spring Bean的生命周期是Spring面試熱點問題。這個問題即考察對Spring的微觀了解,又考察對Spring的宏觀認識,想要答好並不容易!本文希望能夠從源碼角度入手,幫助面試者徹底搞定Spring Bean的生命周期。
只有四個!
是的,Spring Bean的生命周期只有這四個階段。把這四個階段和每個階段對應的擴展點糅合在一起雖然沒有問題,但是這樣非常凌亂,難以記憶。要徹底搞清楚Spring的生命周期,首先要把這四個階段牢牢記住。實例化和屬性賦值對應構造方法和setter方法的注入,初始化和銷毀是用戶能自定義擴展的兩個階段。在這四步之間穿插的各種擴展點,稍后會講。
- 實例化 Instantiation
- 屬性賦值 Populate
- 初始化 Initialization
- 銷毀 Destruction
實例化 -> 屬性賦值 -> 初始化 -> 銷毀
主要邏輯都在doCreate()方法中,邏輯很清晰,就是順序調用以下三個方法,這三個方法與三個生命周期階段一一對應,非常重要,在后續擴展接口分析中也會涉及。
- createBeanInstance() -> 實例化
- populateBean() -> 屬性賦值
- initializeBean() -> 初始化
源碼如下,能證明實例化,屬性賦值和初始化這三個生命周期的存在。關於本文的Spring源碼都將忽略無關部分,便於理解:
/ 忽略了無關代碼
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (instanceWrapper == null) {
// 實例化階段!
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
// 屬性賦值階段!
populateBean(beanName, mbd, instanceWrapper);
// 初始化階段!
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
鏈接:https://www.jianshu.com/p/1dec08d290c1
