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