欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot詳細(xì)講解如何創(chuàng)建及刷新Spring容器bean

 更新時(shí)間:2022年06月09日 09:49:58   作者:望天邊星宿  
前面看spring源碼時(shí)可以發(fā)現(xiàn)refresh()方法十分重要。在這個(gè)方法中會(huì)加載beanDefinition,同時(shí)創(chuàng)建bean對(duì)象。那么在springboot中有沒(méi)有使用這個(gè)refresh()方法呢

一、前期準(zhǔn)備

1.1 創(chuàng)建工程

創(chuàng)建springboot項(xiàng)目,springboot版本為2.5.0,引入spring-boot-starter-web依賴,pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

1.2 創(chuàng)建Controller

創(chuàng)建一個(gè)簡(jiǎn)單的Controller用于測(cè)試

@RestController
public class HelloController {
    public void helloController() {
        System.out.println("創(chuàng)建了");
    }
    @RequestMapping("hello")
    public String hello() {
        return "hello";
    }
}

二、探究過(guò)程

2.1 啟動(dòng)類

項(xiàng)目的運(yùn)行只需要啟動(dòng)類中一行簡(jiǎn)單的代碼,spring容器的創(chuàng)建就是通過(guò)SpringApplication.run(SpringbootApplication.class, args)這一行代碼實(shí)現(xiàn)的。

其實(shí)就是調(diào)用了靜態(tài)的run方法,傳入了啟動(dòng)類的字節(jié)碼對(duì)象。

2.2 SpringApplication

?? run()方法

又調(diào)用了另一個(gè)run方法。

public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
    return run(new Class[]{primarySource}, args);
}

?? run()方法

方法的返回值類型為ConfigurableApplicationContext,ApplicationContext就是Spring的容器。

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
	return new SpringApplication(primarySources).run(args);
}

我們來(lái)看看ConfigurableApplicationContext 繼承結(jié)構(gòu)

ConfigurableApplicationContext接口繼承了ApplicationContext接口

下面我們通過(guò)debug進(jìn)入run()方法中看看

?? run()方法

?? createApplicationContext()方法

容器工廠傳入webApplication的類型,這個(gè)類型為Servlet應(yīng)用。

Springboot可以做響應(yīng)式的Web開(kāi)發(fā),這時(shí)webApplication的類型的類型就不是Servlet。

2.3 ApplicationContextFactory

這里是一個(gè)lambda表達(dá)式的寫(xiě)法,根據(jù)webApplicationType的類型返回對(duì)應(yīng)的容器對(duì)象。

通過(guò)繼承關(guān)系圖可以看出,它的確是ApplicationContext

2.4 SpringApplication

?? run()方法,容器刷新前

看完了createApplicationContext()的過(guò)程,我們?cè)俅位氐?code>run()方法中,此時(shí)context已經(jīng)創(chuàng)建完成。

我們觀察一下context中都有些什么:

其中包含了bean工廠,bean工廠里有beanDefinitionNames和beanDefinitionMap。(與之前看的spring源碼一樣)

不過(guò)這里都是spring容器內(nèi)置的beanDefinition對(duì)象,沒(méi)有我們自定義的helloController,說(shuō)明現(xiàn)在的容器還沒(méi)有刷新。

我們現(xiàn)在獲取不到HelloController的bean對(duì)象,當(dāng)我們能獲取到這個(gè)對(duì)象時(shí),就說(shuō)明容器刷新了。

?? run()方法,容器刷新后

繼續(xù)往下運(yùn)行,我們發(fā)現(xiàn)這行代碼執(zhí)行了好久,根據(jù)方法名稱也可以看出它的功能就是刷新容器。

刷新后我們成功的獲取到了bean對(duì)象。

此時(shí)beanDefinitionMap中包含了138個(gè)對(duì)象,刷新之前只包含5個(gè)。我們可以在里面找到helloController(Hello的H變成了小寫(xiě))

?? refreshContext()方法

下面我們看看refreshContext()方法,其中調(diào)用了refresh()方法。

?? refresh()方法

refreshContext()方法中refresh(context)傳入了容器對(duì)象,在這里調(diào)用了這個(gè)容器對(duì)象的refresh()方法。

后面暫時(shí)不往下看了。

2.5 結(jié)論

在啟動(dòng)類中調(diào)用SpringApplication的run方法時(shí)會(huì)根據(jù)容器的類型創(chuàng)建不同的容器對(duì)象,并調(diào)用容器的refresh方法。

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

相關(guān)文章

  • Spring中的自定義NamespaceHandler詳解

    Spring中的自定義NamespaceHandler詳解

    這篇文章主要介紹了Spring中的自定義NamespaceHandler詳解,通常情況下,Spring生態(tài)圈提供的功能已足夠使用,但不排除特殊情況下,需要匹配特殊及復(fù)雜的業(yè)務(wù)情況,Spring提供了可擴(kuò)展Schema支持,可以自定義命名空間進(jìn)行配置及解析,需要的朋友可以參考下
    2023-11-11
  • JVM 心得 OOM時(shí)的堆信息獲取方法與分析

    JVM 心得 OOM時(shí)的堆信息獲取方法與分析

    下面小編就為大家?guī)?lái)一篇JVM 心得 OOM時(shí)的堆信息獲取方法與分析。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Springboot常用注解及配置文件加載順序詳解

    Springboot常用注解及配置文件加載順序詳解

    這篇文章主要介紹了Springboot常用注解及配置文件加載順序,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • java  LinkedList類詳解及實(shí)例代碼

    java LinkedList類詳解及實(shí)例代碼

    這篇文章主要介紹了java LinkedList類詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Java中ClassLoader類加載學(xué)習(xí)總結(jié)

    Java中ClassLoader類加載學(xué)習(xí)總結(jié)

    本篇文章主要給大家講述了Java中ClassLoader類加載的原理以及用法總結(jié),一起學(xué)習(xí)下。
    2017-12-12
  • java多線程編程之java線程簡(jiǎn)介

    java多線程編程之java線程簡(jiǎn)介

    線程是程序運(yùn)行的基本執(zhí)行單元,線程不僅可以共享進(jìn)程的內(nèi)存,而且還擁有一個(gè)屬于自己的內(nèi)存空間,這段內(nèi)存空間也叫做線程棧
    2014-01-01
  • 如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息

    如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息

    這篇文章主要介紹了如何利用rabbitMq的死信隊(duì)列實(shí)現(xiàn)延時(shí)消息問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 如何在Spring中使用編碼方式動(dòng)態(tài)配置Bean詳解

    如何在Spring中使用編碼方式動(dòng)態(tài)配置Bean詳解

    這篇文章主要給大家介紹了關(guān)于如何在Spring中使用編碼方式動(dòng)態(tài)配置Bean的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-05-05
  • Java web xml文件讀取解析方式

    Java web xml文件讀取解析方式

    這篇文章主要介紹了Java web xml文件讀取解析方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • java異或加密算法

    java異或加密算法

    這篇文章主要介紹了java異或加密算法,有需要的朋友可以參考一下
    2013-12-12

最新評(píng)論