最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

spring?Bean創(chuàng)建的完整過(guò)程記錄

 更新時(shí)間:2022年01月17日 12:36:08   作者:Jimmyhe  
這篇文章主要給大家介紹了關(guān)于Spring中Bean實(shí)例創(chuàng)建的相關(guān)資料,文中通過(guò)實(shí)例代碼和圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

復(fù)習(xí)一下spring實(shí)現(xiàn)IOC的源碼流程準(zhǔn)備工作:

?強(qiáng)烈建議大家從git上拉取spring源碼來(lái)學(xué)習(xí)Spring源碼。因?yàn)槔锩嫦噍^于IDEA生成的會(huì)有注釋,里面有的方法會(huì)有注釋看起來(lái)會(huì)省力一點(diǎn)。

?以下都是用5.0.2版本來(lái)做闡述。

bean創(chuàng)建的流程圖

寫(xiě)在前面:建議大家一定要自己用實(shí)例跑一遍,做好記錄。如果只是看看會(huì)非常抽象。此流程圖作為梗概,便于加強(qiáng)記憶和理解,新手或無(wú)基礎(chǔ)的有個(gè)印象即可。等跟隨本文走通一遍,在回過(guò)頭看這個(gè)圖,或許會(huì)有收獲

源碼走一遍bean的定義這是我的bean目錄結(jié)構(gòu),只是做一個(gè)例子

獲取核心容器對(duì)象,bean最后都會(huì)放在此容器對(duì)象中

    *   ApplicationContext的三個(gè)實(shí)現(xiàn)類
    *   ClassPathXmlApplicationContext  它可以加載類路徑下的配置文件,要求必須在類路徑下
    *   FileSystemXmlApplicationContext  可以加載任意路徑下的配置文件,必須有訪問(wèn)權(quán)限
    *   AnnotationConfigApplicationContext 用于讀取注解創(chuàng)建容器的
    
    這里我用ClassPathXmlApplicationContext來(lái)做演示
    
   public class MyTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    }
}

快速開(kāi)始

建議用IDEA的debug模式來(lái)觀察Spring的IOC過(guò)程

進(jìn)入到此類的構(gòu)造方法中

查看setConfigLocations,就是將配置文件加載到configLocations里去

向下執(zhí)行,查看refresh()

this.prepareRefresh(): 此方法是準(zhǔn)備工作,大家感興趣可以點(diǎn)進(jìn)去看一下,可以看到里面是獲取時(shí)間,獲取環(huán)境信息的一些設(shè)置。

this.obtainFreshBeanFactory(): 這一步是創(chuàng)建beanFactory,并且讀取Bean的信息,源碼注釋中還有寫(xiě)到

// Tell the subclass to refresh the internal bean factory.會(huì)告訴子類去刷新內(nèi)部bean工廠

this.refreshBeanFactory:

	 * This implementation performs an actual refresh of this context's underlying
	 * bean factory, shutting down the previous bean factory (if any) and
	 * initializing a fresh bean factory for the next phase of the context's lifecycle.
	 
	 這個(gè)實(shí)現(xiàn)類的方法會(huì)刷新容器中的beanFactory,關(guān)閉之前存在的并且初始化新的beanFactory

利用this.createBeanFactory() 創(chuàng)建了一個(gè)beanFactory,類型為DefaultListableBeanFactory

這個(gè)類接著往下走:this.loadBeanDefinitions(beanFactory);

	 * Load bean definitions into the given bean factory, typically through
	 * delegating to one or more bean definition readers.
	 
	 這個(gè)方法會(huì)將beandefinitionsReader讀取到的bean definitions放入bean工廠,我們以上提出的三種
	 注入方式都會(huì)走到這里,將bean信息丟進(jìn)去

返回上述 refresh()

this.prepareBeanFactory(beanFactory); 設(shè)置和忽略一些對(duì)象值

this.postProcessBeanFactory(beanFactory); 空方法可自定義擴(kuò)展

this.invokeBeanFactoryPostProcessors(beanFactory);

	 * Instantiate and invoke all registered BeanFactoryPostProcessor beans,
	 * respecting explicit order if given.
	 * <p>Must be called before singleton instantiation.
	 
	 實(shí)例化所有beanFactory組件

registerBeanPostProcessors(beanFactory);

Instantiate and register all BeanPostProcessor beans,  //先注冊(cè)再調(diào)用

initApplicationEventMulticaster(); 觀察者模式監(jiān)聽(tīng)器, 監(jiān)聽(tīng)組件的相關(guān)狀態(tài),并決定相關(guān)調(diào)用方法。

finishBeanFactoryInitialization(beanFactory); 重要!!

	 * Finish the initialization of this context's bean factory,
	 * initializing all remaining singleton beans.
	 
	 完成了容器bean factory的初始化,并且初始化其他的bean單例對(duì)象

beanFactory.preInstantiateSingletons(); 實(shí)例化方法

此方法最后this.getBean(beanName)

繼續(xù)

Return an instance, which may be shared or independent, of the specified bean.

注釋已經(jīng)很清楚了,此方法會(huì)返回一個(gè)實(shí)例,就是我們的bean對(duì)象

進(jìn)入到createBean方法中

繼續(xù)進(jìn)入![image-20200714221630608](/Users/hjj/Library/Application Support/typora-user-images/image-20200714221630608.png)

繼續(xù)進(jìn)入

Instantiate the given bean using its default constructor.

這個(gè)方法注釋說(shuō)明了實(shí)例化對(duì)象是用構(gòu)造器完成的

繼續(xù)看他如何構(gòu)造的

ca 就是Constructor,從這里我們基本可以看出容器內(nèi),bean對(duì)象的實(shí)例化
是利用反射的基本原理,獲取類構(gòu)造器,然后newInstance來(lái)實(shí)現(xiàn)的

以上就是bean對(duì)象實(shí)例化的基本過(guò)程,下面是實(shí)例化完成后的初始化過(guò)程

回到這里,實(shí)例化完成后

注釋說(shuō)明了在populateBean完成bean的初始化

繼續(xù)

會(huì)看到在此方法里會(huì)調(diào)用前置和后置處理器來(lái)初始化Bean

以上就完成了bean的實(shí)例化過(guò)程,文章開(kāi)頭的那個(gè)圖剛開(kāi)始有點(diǎn)懵,但是一旦跑完一遍bean的實(shí)例化過(guò)程,再次結(jié)合圖,就清晰了很多。本文只是簡(jiǎn)單的跟隨debug順序,完整的走了一遍bean實(shí)例化的過(guò)程,還有特殊情況并沒(méi)有討論,后期會(huì)重新用新文章再來(lái)拓展。

如有不足還請(qǐng)指正。

總結(jié)

到此這篇關(guān)于spring Bean創(chuàng)建的文章就介紹到這了,更多相關(guān)Spring Bean創(chuàng)建過(guò)程內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一起因MySQL時(shí)間戳精度引發(fā)的血案分析

    一起因MySQL時(shí)間戳精度引發(fā)的血案分析

    這篇文章主要給大家介紹了一起因MySQL時(shí)間戳精度引發(fā)的血案的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java的靜態(tài)方法調(diào)用方式

    java的靜態(tài)方法調(diào)用方式

    這篇文章主要介紹了java的靜態(tài)方法調(diào)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Spring?Security權(quán)限想要細(xì)化到按鈕實(shí)現(xiàn)示例

    Spring?Security權(quán)限想要細(xì)化到按鈕實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了Spring?Security權(quán)限想要細(xì)化到按鈕實(shí)現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 深入解析Spring中的立即加載和延遲加載

    深入解析Spring中的立即加載和延遲加載

    本文介紹了Spring框架中的立即加載和延遲加載策略,并解釋了它們的適用場(chǎng)景和使用方法,根據(jù)具體的需求和應(yīng)用場(chǎng)景,選擇合適的加載策略,可以提高應(yīng)用程序的性能和資源利用效率,感興趣的朋友跟隨小編一起看看吧
    2023-07-07
  • Servlet Filter過(guò)濾器執(zhí)行順序

    Servlet Filter過(guò)濾器執(zhí)行順序

    這篇文章主要介紹了Servlet Filter過(guò)濾器執(zhí)行順序的相關(guān)資料,幫助大家更好的理解為什么要用過(guò)濾器,感興趣的朋友可以了解下
    2020-12-12
  • Java8新特性詳解與實(shí)戰(zhàn)分享

    Java8新特性詳解與實(shí)戰(zhàn)分享

    Java 8作為Java語(yǔ)言的一個(gè)重要更新,引入了一系列新特性,這些特性不僅提高了代碼的可讀性和可維護(hù)性,還增強(qiáng)了程序的性能,本文將詳細(xì)介紹Java 8中的幾個(gè)關(guān)鍵使用技巧,并通過(guò)代碼案例來(lái)展示它們的應(yīng)用,需要的朋友可以參考下
    2024-06-06
  • JAVA_基本LDAP操作實(shí)例

    JAVA_基本LDAP操作實(shí)例

    這篇文章介紹了JAVA_基本LDAP操作實(shí)例,有需要的朋友可以參考一下
    2013-09-09
  • java遞歸與非遞歸實(shí)現(xiàn)掃描文件夾下所有文件

    java遞歸與非遞歸實(shí)現(xiàn)掃描文件夾下所有文件

    這篇文章主要為大家詳細(xì)介紹了java遞歸與非遞歸實(shí)現(xiàn)掃描文件夾下所有文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Java 關(guān)于String字符串原理上的問(wèn)題

    Java 關(guān)于String字符串原理上的問(wèn)題

    字符串廣泛應(yīng)用 在 Java 編程中,在 Java 中字符串屬于對(duì)象,Java 提供了 String 類來(lái)創(chuàng)建和操作字符串,讓我們一起來(lái)了解它
    2022-04-04
  • Java數(shù)據(jù)脫敏常用方法(3種)

    Java數(shù)據(jù)脫敏常用方法(3種)

    數(shù)據(jù)脫敏常用在電話號(hào)碼和身份證號(hào),本文主要介紹了Java數(shù)據(jù)脫敏常用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評(píng)論

库车县| 安溪县| 黔西| 衡山县| 聊城市| 芷江| 图们市| 那坡县| 诸城市| 常山县| 阿鲁科尔沁旗| 抚州市| 绍兴市| 沙雅县| 保山市| 淮南市| 邢台县| 祁阳县| 文水县| 会宁县| 东山县| 凯里市| 永春县| 类乌齐县| 红安县| 腾冲县| 东乡族自治县| 鲜城| 河池市| 徐州市| 分宜县| 北票市| 安新县| 密云县| 台中县| 准格尔旗| 石狮市| 宾川县| 南川市| 休宁县| 资阳市|