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

一文帶你了解SpringBoot的啟動(dòng)原理

 更新時(shí)間:2023年05月16日 11:42:11   作者:算.子  
大家通常只需要給一個(gè)類添加一個(gè)@SpringBootApplication 注解,然后再加一個(gè)main 方法里面固定的寫法 SpringApplication.run(Application.class, args);那么spring boot 到底是如何啟動(dòng)服務(wù)的呢,接下來(lái)咱們通過源碼解析,需要的朋友可以參考下

Spring Boot 的啟動(dòng)原理可以概括為以下幾個(gè)步驟:

  • 加載 Spring Boot 應(yīng)用程序的啟動(dòng)類
  • 根據(jù)啟動(dòng)類所在的包路徑掃描相關(guān)的類
  • 根據(jù)掃描到的類自動(dòng)配置 Spring 應(yīng)用程序
  • 啟動(dòng)嵌入式的 Web 服務(wù)器
  • 運(yùn)行 Spring 應(yīng)用程序

Spring Boot 啟動(dòng)過程的源碼剖析:

@SpringBootApplication // 標(biāo)記該類為 Spring Boot 應(yīng)用程序的啟動(dòng)類
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args); // 執(zhí)行 Spring Boot 應(yīng)用程序
    }
}

在 Spring Boot 應(yīng)用程序的啟動(dòng)類中,需要使用 @SpringBootApplication 注解標(biāo)記該類,以告訴 Spring Boot 這是應(yīng)用程序的啟動(dòng)類。@SpringBootApplication 注解包含了 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 這三個(gè)注解,分別表示該類是配置類、開啟自動(dòng)配置和掃描組件。

在 main 方法中,調(diào)用 SpringApplication.run 方法來(lái)啟動(dòng) Spring Boot 應(yīng)用程序。該方法接受兩個(gè)參數(shù),第一個(gè)參數(shù)是啟動(dòng)類的類對(duì)象,第二個(gè)參數(shù)是主方法的參數(shù)。在 SpringApplication.run 方法中,會(huì)執(zhí)行以下幾個(gè)步驟:

  • 創(chuàng)建一個(gè) SpringApplication 對(duì)象,該對(duì)象包含了所有的 Spring Boot 應(yīng)用程序配置信息。
  • 根據(jù) SpringApplication 對(duì)象中的配置信息,創(chuàng)建一個(gè) ApplicationContext 對(duì)象,該對(duì)象是 Spring 應(yīng)用程序的上下文。
  • 將所有的 @Configuration 類型的類注冊(cè)到 ApplicationContext 對(duì)象中。
  • 根據(jù) @EnableAutoConfiguration 注解,自動(dòng)配置 Spring 應(yīng)用程序。
  • 掃描所有的 @Component 注解的類,并將其注冊(cè)到 ApplicationContext 中。
  • 啟動(dòng)嵌入式的 Web 服務(wù)器。
  • 運(yùn)行 Spring 應(yīng)用程序。

下面是 SpringApplication.run 方法的源碼注釋:

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

public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
    // 創(chuàng)建 SpringApplication 對(duì)象,包含了所有的 Spring Boot 應(yīng)用程序配置信息
    SpringApplication application = new SpringApplication(primarySources);
    // 運(yùn)行 Spring Boot 應(yīng)用程序,并返回上下文對(duì)象
    return application.run(args);
}

public ConfigurableApplicationContext run(String... args) {
    // 創(chuàng)建并啟動(dòng) ConfigurableApplicationContext 對(duì)象,返回該對(duì)象
    ConfigurableApplicationContext context = createApplicationContext();
    // 執(zhí)行 Spring 應(yīng)用程序的監(jiān)聽器
    listeners.starting(this.applicationArguments);
    try {
        // 準(zhǔn)備 ApplicationContext 環(huán)境
        prepareEnvironment(context, this.environment);
        // 配置 ApplicationContext
        configureIgnoreBeanInfo(context);
        // 執(zhí)行所有的 ApplicationContextInitializer
        applyInitializers(context);
        // 執(zhí)行所有的 SpringApplicationRunListener 的 starting 方法
        listeners.contextPrepared(context);
        // 打印 Spring Boot 應(yīng)用程序的 Banner
        Banner printedBanner = printBanner();
        // 創(chuàng)建 ApplicationContext
        context.refresh();
        // 將 ApplicationContext 注冊(cè)到 JVM 關(guān)閉鉤子中
        prepareContext(context, printedBanner);
        // 執(zhí)行所有的 ApplicationContextInitializer 的 postProcessApplicationContext 方法
        postProcessApplicationContext(context);
        // 執(zhí)行所有的 SpringApplicationRunListener 的 contextLoaded 方法
        listeners.contextLoaded(context);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, listeners);
        throw new IllegalStateException(ex);
    }

    try {
        // 執(zhí)行所有的 SpringApplicationRunListener 的 started 方法
        listeners.started(context);
        // 啟動(dòng)嵌入式的 Web 服務(wù)器
        callRunners(context, this.applicationArguments);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, listeners);
        throw new IllegalStateException(ex);
    }

    try {
        // 執(zhí)行所有的 SpringApplicationRunListener 的 running 方法
        listeners.running(context);
    }
    catch (Throwable ex) {
        handleRunFailure(context, ex, listeners);
        throw new IllegalStateException(ex);
    }

    return context;
}

在 SpringApplication.run 方法中,還會(huì)調(diào)用一些其他的方法,如 prepareEnvironment、applyInitializers、postProcessApplicationContext、callRunners 等,這些方法是 Spring Boot 應(yīng)用程序啟動(dòng)的關(guān)鍵步驟,它們會(huì)對(duì)應(yīng)用程序進(jìn)行配置、初始化、啟動(dòng)等操作。

以上就是一文帶你了解SpringBoot的啟動(dòng)原理的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot啟動(dòng)原理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java業(yè)務(wù)中臺(tái)確保數(shù)據(jù)一致性的解決方案

    Java業(yè)務(wù)中臺(tái)確保數(shù)據(jù)一致性的解決方案

    數(shù)據(jù)一致性通常指關(guān)聯(lián)數(shù)據(jù)之間的邏輯關(guān)系是否正確和完整。而數(shù)據(jù)存儲(chǔ)的一致性模型則可以認(rèn)為是存儲(chǔ)系統(tǒng)和數(shù)據(jù)使用者之間的一種約定。如果使用者遵循這種約定,則可以得到系統(tǒng)所承諾的訪問結(jié)果
    2021-10-10
  • Spring Boot配置接口WebMvcConfigurer的實(shí)現(xiàn)

    Spring Boot配置接口WebMvcConfigurer的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot配置接口WebMvcConfigurer的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 解決Maven 項(xiàng)目報(bào)錯(cuò) java.httpservlet和synchronized使用方法

    解決Maven 項(xiàng)目報(bào)錯(cuò) java.httpservlet和synchronized使用方法

    下面小編就為大家?guī)?lái)一篇解決Maven 項(xiàng)目報(bào)錯(cuò) java.httpservlet和synchronized使用方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-07-07
  • window下安裝和配置maven環(huán)境

    window下安裝和配置maven環(huán)境

    這篇文章主要為大家詳細(xì)介紹了window下安裝和配置maven環(huán)境的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 解決spring data jpa 批量保存更新的問題

    解決spring data jpa 批量保存更新的問題

    這篇文章主要介紹了解決spring data jpa 批量保存更新的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 關(guān)于@Autowierd && @Resource 你真的了解嗎

    關(guān)于@Autowierd && @Resource 你真的了解嗎

    這篇文章主要介紹了關(guān)于@Autowierd && @Resource的具體使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • spring中時(shí)間格式化的兩種方法示例講解

    spring中時(shí)間格式化的兩種方法示例講解

    這篇文章主要介紹了spring中時(shí)間格式化的兩種方法,方法一自己格式化,方法二通過配置,結(jié)合實(shí)例代碼講解的非常詳細(xì),文中補(bǔ)充介紹了Spring項(xiàng)目中時(shí)間格式化的方法,需要的朋友可以參考下
    2023-08-08
  • mybatis之如何獲取表中某一列的最大值

    mybatis之如何獲取表中某一列的最大值

    這篇文章主要介紹了mybatis之如何獲取表中某一列的最大值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • JDK反序列化時(shí)修改類的全限定性名解析

    JDK反序列化時(shí)修改類的全限定性名解析

    這篇文章主要介紹了JDK反序列化時(shí)修改類的全限定性名解析,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)之AC自動(dòng)機(jī)算法的實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之AC自動(dòng)機(jī)算法的實(shí)現(xiàn)

    AC自動(dòng)機(jī)算法常被認(rèn)為是Trie樹+KMP算法的結(jié)合體,它是一個(gè)多模式匹配算法,在模式匹配領(lǐng)域被廣泛應(yīng)用。本文將詳細(xì)為大家介紹AC自動(dòng)機(jī)的原理與實(shí)現(xiàn)方法,感興趣的可以了解一下
    2022-12-12

最新評(píng)論