Spring中Bean的生命周期
Bean是什么?
本來沒有這一節的,但是寫完源碼之后,在想是否能夠類比一下別的更具體的東西,然后想着想着突然想到了個Bean到底是什么?好像用了這么久的Spring,都還沒想過這個問題。然后就去看看官網、書、博客等。就有了這一節。
官網的解釋:
《Spring5核心原理與30個類手寫實戰》中的解釋:
Bean對於Spring的意義就像Object對於OOP的意義一樣。Spring在Java組件化(JavaBean、EJB等)開發理念下出現的。
個人理解:
Bean是一個組件(對象),組成了我們的應用程序,通過IoC可以對其進行管理。就好比去吃自助餐里面的一道道菜。
生命周期
源碼中的描述:
大致過程:
源碼分析
上圖中的核心方法幾乎都在doCreateBean()中,我們直接進入到AbstractAutowireCapableBeanFactory類中。
首先,進入bean實例的創建,createBeanInstance()方法。
我們可以看見上圖中Bean可以通過instantiateUsingFactoryMethod()方法創建,也可以通過autowireConstructor()方法創建,但是默認的是使用instantiateBean()方法創建。我們點進去看看
我們可以看到這里面有JDK的安全API以及對獲取到的bean實例對象進行封裝,最重要的是getInstantiationStrategy().instantiate();這個方法。我們繼續點進去。
是不是看見了個很熟悉的方法?clazz.getDeclaredConstructor();獲取構造方法。是不是接下來就會想到了對應的newInstance()?這其實就是在BeanUtils.instantiateClass(constructorToUse);調用了。到此,Bean的實例化出來了,后續就是我們上面說的對Bean實例的封裝BeanWrapper了。
接下來,我們進入bean實例對象的屬性填充(populateBean()方法)。
重要的是applyPropertyValues()這個方法,我們點進去看看。
其中最重要的兩個方法是:解析resolveValueIfNecessary()和注入setPropertyValues()方法。
大致過程是:
-
屬性類型不需要強制轉換時,不需要解析屬性值,直接進行依賴注入
-
屬性值類型需要進行強制轉換時,如對其他對象的引用等,首先需要解析屬性值,然后對解析后的屬性值進行依賴注入
我們進入resolveValueIfNecessary()方法,可以看見這里面有對不同類型屬性的解析,感興趣自己點進去看看。
我們進入setPropertyValues()這個方法,到AbstractPropertyAccessor這個類中,我們會發現很多setPropertyValues的重載方法。但是都會走到setPropertyValue()這個方法中。
我們繼續跟進,還是會發現有很多的setPropertyValue()方法的重載,我靠,怎么這么多!但最后還是會回到這幾個方法。這時候,我們屬性的依賴注入終於要進行了。我們可以看見主要有3類,對數組類型、對List類型和對Map類型的注入
到此,我們的屬性填充終於終於終於完成了,重載的方法是真的多!
接下來,我們進入初始化方法(initializeBean())中。
在這個里面,我們可以看見上面畫的流程圖中的大部分方法了。Aware接口、BeanPostProcess和init-method
Aware接口上面已經貼出來了,就不展示了。
applyBeanPostProcessorsBeforeInitialization()方法
invokeInitMethods()方法
applyBeanPostProcessorsAfterInitialization()方法
終於要到銷毀方法了,在refresh()中的destroyBeans()方法。
我們點進去,會調用當前BeanFactory的destroySingletons()方法
調用父類的destroySingletons()方法
到此,我們整個Bean的生命周期就結束了。