【Spring】Bean是什么?Bean的生命周期


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()方法。

大致過程是:

  1. 屬性類型不需要強制轉換時,不需要解析屬性值,直接進行依賴注入

  2. 屬性值類型需要進行強制轉換時,如對其他對象的引用等,首先需要解析屬性值,然后對解析后的屬性值進行依賴注入

在這里插入圖片描述

我們進入resolveValueIfNecessary()方法,可以看見這里面有對不同類型屬性的解析,感興趣自己點進去看看。

在這里插入圖片描述

我們進入setPropertyValues()這個方法,到AbstractPropertyAccessor這個類中,我們會發現很多setPropertyValues的重載方法。但是都會走到setPropertyValue()這個方法中。
在這里插入圖片描述

我們繼續跟進,還是會發現有很多的setPropertyValue()方法的重載,我靠,怎么這么多!但最后還是會回到這幾個方法。這時候,我們屬性的依賴注入終於要進行了。我們可以看見主要有3類,對數組類型、對List類型和對Map類型的注入

在這里插入圖片描述

到此,我們的屬性填充終於終於終於完成了,重載的方法是真的多!

接下來,我們進入初始化方法(initializeBean())中。

在這個里面,我們可以看見上面畫的流程圖中的大部分方法了。Aware接口、BeanPostProcess和init-method

在這里插入圖片描述

Aware接口上面已經貼出來了,就不展示了。

applyBeanPostProcessorsBeforeInitialization()方法

在這里插入圖片描述

invokeInitMethods()方法

在這里插入圖片描述

applyBeanPostProcessorsAfterInitialization()方法

在這里插入圖片描述

終於要到銷毀方法了,在refresh()中的destroyBeans()方法。

我們點進去,會調用當前BeanFactory的destroySingletons()方法

在這里插入圖片描述

調用父類的destroySingletons()方法

在這里插入圖片描述

到此,我們整個Bean的生命周期就結束了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM