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

Spring超詳細(xì)講解創(chuàng)建BeanDefinition流程

 更新時(shí)間:2022年06月09日 10:06:53   作者:望天邊星宿  
Spring在初始化過(guò)程中,將xml中定義的對(duì)象解析到了BeanDefinition對(duì)象中,我們有必要了解一下BeanDefinition的內(nèi)部結(jié)構(gòu),有助于我們理解Spring的初始化流程

參考視頻:https://www.bilibili.com/video/BV1Bq4y1Q7GZ?p=4

通過(guò)視頻的學(xué)習(xí)和自身的理解整理出的筆記。

一、前期準(zhǔn)備

1.1 環(huán)境依賴

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.7.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.7.RELEASE</version>
    </dependency>
</dependencies>

1.2 實(shí)體類

簡(jiǎn)單的User類,在測(cè)試過(guò)程中創(chuàng)建這個(gè)User類的對(duì)象。

public class User {
    private Integer id;
    private String name;
    public User() {
        System.out.println("創(chuàng)建了");
    }
}

1.3 applicationContext.xml

在applicationContext.xml配置bean對(duì)象。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean class="com.zqc.domain.User" id="user">
    </bean>
</beans>

1.4 測(cè)試代碼

通過(guò)applicationContext.xml配置應(yīng)用程序的上下文,在容器中創(chuàng)建User對(duì)象。

public class SpringDemo {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) context.getBean("user");
    }
}

二、探究過(guò)程

2.1 目標(biāo)

目標(biāo):BeanDefinition是什么?是什么時(shí)候創(chuàng)建的?

2.2 BeanDefinition的創(chuàng)建過(guò)程

2.2.1 回顧bean對(duì)象的創(chuàng)建

前面在分析Bean創(chuàng)建的過(guò)程中,發(fā)現(xiàn)在執(zhí)行完refresh()方法后就完成了bean對(duì)象的創(chuàng)建。

在測(cè)試代碼中創(chuàng)建context對(duì)象:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

ClassPathXmlApplicationContext構(gòu)造器中調(diào)用了另一個(gè)構(gòu)造器:

該構(gòu)造器中執(zhí)行了refresh()方法

在refresh()方法中創(chuàng)建了非懶加載的單例對(duì)象:

所以BeanDefinition可定在這行代碼之前創(chuàng)建的。下面看看在refresh()方法的什么地方創(chuàng)建了BeanDefinition。

2.2.2 AbstractApplicationContext

?? refresh()方法

首先我們要知道,Bean對(duì)象和BeanDefinition對(duì)象都是是通過(guò)BeanFactory創(chuàng)建。

所以,只有在獲取BeanFactory之后才能獲取到BeanDefinition。

在這一行創(chuàng)建了beanFactory對(duì)象。

查看一下beanFactory,找尋與BeanDefinition相關(guān)的屬性: beanDefinitionMap、beanDefinitionNames

?? beanDefinitionMap

key:bean的名稱

value:beanDefinition,描述bean的相關(guān)信息

?? beanDefinitionNames:beanDefination的名稱

說(shuō)明當(dāng)ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory()執(zhí)行完畢后,BeanDefination就已經(jīng)創(chuàng)建完畢了。

?? obtainFreshBeanFactory()方法

?? refreshBeanFactory()方法

通過(guò)這行代碼loadBeanDefinitions(beanFactory)創(chuàng)建了BeanDefinition對(duì)象。

2.2.3 AbstractXmlApplicationContext

?? loadBeanDefinitions()方法,輸入beanFactory

通過(guò)讀取xml文件來(lái)創(chuàng)建BeanDefinitions

beanFactory就是XmlBeanDefinitionReader里面的registry,所以后面我們看到的registry就是beanFactory對(duì)象。

?? loadBeanDefinitions()方法,輸入beanDefinitionReader

方法重載,上面的形參類型為DefaultListableBeanFactory,這里的形參beanDefinitionReader,就是上面的beanFactory。

?? loadBeanDefinitions()方法,輸入locations

loadBeanDefinitions(location)方法里創(chuàng)建了BeanDefinition。

2.2.4 AbstractBeanDefinitionReader

?? loadBeanDefinitions()方法,輸入locations

?? loadBeanDefinitions()方法,輸入locationsSet<Resource>

?? loadBeanDefinitions()方法,輸入可變參數(shù)resources

2.2.5 XmlBeanDefinitionReader

?? loadBeanDefinitions()方法,輸入resources

?? loadBeanDefinitions()方法

?? doLoadBeanDefinitions()方法

?? registerBeanDefinitions()方法

2.2.6 DefaultBeanDefinitionDocumentReader

?? registerBeanDefinitions()方法

?? doRegisterBeanDefinitions()方法

?? parseBeanDefinitions()方法

這里通過(guò)解析xml文件遍歷里面的bean標(biāo)簽創(chuàng)建beanDefinition

?? parseDefaultElement()方法

根據(jù)當(dāng)前的元素標(biāo)簽,選擇不同的解析方式。比如:import、alias、beans

?? processBeanDefinition()方法

在這里創(chuàng)建beanDefinition對(duì)象并存儲(chǔ)在bdHolder中:

2.2.7 BeanDefinitionParserDelegate

?? parseBeanDefinitionElement()方法

?? parseBeanDefinitionElement()方法

?? parseBeanDefinitionElement()方法

創(chuàng)建BeanDefinition對(duì)象后,繼續(xù)對(duì)xml文件進(jìn)行解析并設(shè)置beanDefinition。

下面繼續(xù)簡(jiǎn)單看看createBeanDefinition的過(guò)程。

?? createBeanDefinition()方法

2.2.8 BeanDefinitionReaderUtils

?? createBeanDefinition()方法

2.2.9 結(jié)論

在容器創(chuàng)建時(shí)會(huì)先去創(chuàng)建一個(gè)beanFactory,然后使用XmlBeanDefinitionReader去讀取xml配置文件,把里面的標(biāo)簽進(jìn)行解析,然后創(chuàng)建BeanDefinition對(duì)象來(lái)存放bean標(biāo)簽中各個(gè)屬性的值。所以BeanDefinition相當(dāng)于就是保存了bean的定義信息的對(duì)象。

通過(guò)BeanDefinition里面的信息,就可以使用反射來(lái)創(chuàng)建bean對(duì)象。

2.3 BeanDefinition的存儲(chǔ)

2.3.1 DefaultBeanDefinitionDocumentReader

我們回到【2.2.6】節(jié)的DefaultBeanDefinitionDocumentReader的processBeanDefinition()方法中。

在這里創(chuàng)建beanDefinition對(duì)象并存儲(chǔ)在bdHolder中。

BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);

那么接下來(lái)應(yīng)該將bdHolder保存下來(lái)。

可以看出來(lái)getReaderContext().getRegistry()這就是一個(gè)beanFactory對(duì)象

BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());

這段代碼的作用就是將beanDefintion對(duì)象注冊(cè)到beanFactory中。

下面我們看看registerBeanDefinition()方法。

2.3.2 BeanDefinitionReaderUtils

下面看看registerBeanDefinition()方法。

2.3.3 DefaultListableBeanFactory

最終會(huì)運(yùn)行到這里:

2.3.4 結(jié)論

BeanDefinition被創(chuàng)建后會(huì)被存入beanDefinitionMap集合和beanDefinitionNames集合中。

  • beanDefinitionMap:key為beanName,value為beanDefinition
  • beanDefinitionNames:存儲(chǔ)beanName

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

相關(guān)文章

  • 深入解析Spring Cloud內(nèi)置的Zuul過(guò)濾器

    深入解析Spring Cloud內(nèi)置的Zuul過(guò)濾器

    這篇文章主要給大家深入的介紹了Spring Cloud內(nèi)置的Zuul過(guò)濾器的相關(guān)資料,文中給大家介紹的很詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-02-02
  • mybatis-plus指定字段模糊查詢的實(shí)現(xiàn)方法

    mybatis-plus指定字段模糊查詢的實(shí)現(xiàn)方法

    最近項(xiàng)目中使用springboot+mybatis-plus來(lái)實(shí)現(xiàn),所以下面這篇文章主要給大家介紹了關(guān)于mybatis-plus實(shí)現(xiàn)指定字段模糊查詢的相關(guān)資料,需要的朋友可以參考下
    2022-04-04
  • SpringBoot如何通過(guò)配置禁用swagger

    SpringBoot如何通過(guò)配置禁用swagger

    這篇文章主要給大家介紹了關(guān)于SpringBoot如何通過(guò)配置禁用swagger的相關(guān)資料,Swagger用來(lái)在開(kāi)發(fā)階段方便前后端分離的項(xiàng)目實(shí)戰(zhàn)中,提高前后端人員的工作效率,降低交流成本,但是版本上線之后要是把Swagger帶上去會(huì)存在很大的風(fēng)險(xiǎn),需要的朋友可以參考下
    2023-08-08
  • java加解密RSA使用方法代碼示例

    java加解密RSA使用方法代碼示例

    這篇文章主要介紹了java加解密RSA使用方法代碼示例,還是比較不錯(cuò)的,這里分享給大家,供需要的朋友參考。
    2017-10-10
  • Springboot項(xiàng)目中使用redis的配置詳解

    Springboot項(xiàng)目中使用redis的配置詳解

    這篇文章主要介紹了Springboot項(xiàng)目中使用redis的配置詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • SpringBoot源碼剖析之屬性文件加載原理

    SpringBoot源碼剖析之屬性文件加載原理

    這篇文章主要給大家介紹了關(guān)于SpringBoot源碼剖析之屬性文件加載原理的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • 深入了解Java核心類庫(kù)--泛型類

    深入了解Java核心類庫(kù)--泛型類

    這篇文章主要為大家詳細(xì)介紹了java泛型類定義與使用的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能給你帶來(lái)幫助
    2021-07-07
  • 關(guān)于遠(yuǎn)程調(diào)用RestTemplate的使用避坑指南

    關(guān)于遠(yuǎn)程調(diào)用RestTemplate的使用避坑指南

    這篇文章主要介紹了關(guān)于遠(yuǎn)程調(diào)用RestTemplate的使用避坑指南,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • springcloud整合到項(xiàng)目中無(wú)法啟動(dòng)報(bào)錯(cuò)Failed to start bean 'eurekaAutoServiceRegistration'

    springcloud整合到項(xiàng)目中無(wú)法啟動(dòng)報(bào)錯(cuò)Failed to start bean&n

    這篇文章主要介紹了springcloud整合到項(xiàng)目中無(wú)法啟動(dòng)報(bào)錯(cuò)Failed to start bean 'eurekaAutoServiceRegistration'問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • IDEA如何使用spring-Initializr快速搭建SpringBoot

    IDEA如何使用spring-Initializr快速搭建SpringBoot

    這篇文章主要介紹了IDEA如何使用spring-Initializr快速搭建SpringBoot問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05

最新評(píng)論

勃利县| 滦平县| 抚州市| 大同县| 宣城市| 福清市| 阿拉善右旗| 昭平县| 会理县| 泸定县| 卫辉市| 安顺市| 康定县| 永丰县| 阿拉善左旗| 容城县| 福泉市| 大田县| 耿马| 建始县| 鄄城县| 淄博市| 宁都县| 怀远县| 康平县| 宣化县| 西峡县| 常山县| 崇左市| 城固县| 尖扎县| 靖西县| 青田县| 丰顺县| 扬州市| 南雄市| 揭东县| 建湖县| 广饶县| 平远县| 雷波县|