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

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

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

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

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

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

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

在 main 方法中,調(diào)用 SpringApplication.run 方法來(lái)啟動(dòng) Spring Boot 應(yīng)用程序。該方法接受兩個(gè)參數(shù),第一個(gè)參數(shù)是啟動(dòng)類(lèi)的類(lèi)對(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 類(lèi)型的類(lèi)注冊(cè)到 ApplicationContext 對(duì)象中。
  • 根據(jù) @EnableAutoConfiguration 注解,自動(dòng)配置 Spring 應(yīng)用程序。
  • 掃描所有的 @Component 注解的類(lèi),并將其注冊(cè)到 ApplicationContext 中。
  • 啟動(dòng)嵌入式的 Web 服務(wù)器。
  • 運(yùn)行 Spring 應(yīng)用程序。

下面是 SpringApplication.run 方法的源碼注釋?zhuān)?/p>

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)聽(tīng)器
    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?web訪(fǎng)問(wèn)http://localhost:8080/xx/xx.jsp報(bào)404錯(cuò)誤問(wèn)題的解決方法

    Java?web訪(fǎng)問(wèn)http://localhost:8080/xx/xx.jsp報(bào)404錯(cuò)誤問(wèn)題的解決方法

    這篇文章主要給大家介紹了關(guān)于Java?web訪(fǎng)問(wèn)http://localhost:8080/xx/xx.jsp報(bào)404錯(cuò)誤問(wèn)題的解決方法,很多小伙伴在剛開(kāi)始用Springboot整合jsp開(kāi)發(fā)時(shí)都會(huì)遇到這個(gè)問(wèn)題, 按照別人的教程一步一步搭建,但就是會(huì)報(bào)404,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • Spring Boot應(yīng)用事件監(jiān)聽(tīng)示例詳解

    Spring Boot應(yīng)用事件監(jiān)聽(tīng)示例詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot應(yīng)用事件監(jiān)聽(tīng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • eclipse下整合springboot和mybatis的方法步驟

    eclipse下整合springboot和mybatis的方法步驟

    這篇文章主要介紹了eclipse下整合springboot和mybatis的方法步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-03-03
  • Java多線(xiàn)程編程中synchronized線(xiàn)程同步的教程

    Java多線(xiàn)程編程中synchronized線(xiàn)程同步的教程

    Java的synchronized關(guān)鍵字可以修飾方法和對(duì)象來(lái)構(gòu)建線(xiàn)程間的同步,這里我們就來(lái)共同學(xué)習(xí)Java多線(xiàn)程編程中synchronized線(xiàn)程同步的教程:
    2016-07-07
  • 一文了解Java讀寫(xiě)鎖ReentrantReadWriteLock的使用

    一文了解Java讀寫(xiě)鎖ReentrantReadWriteLock的使用

    ReentrantReadWriteLock稱(chēng)為讀寫(xiě)鎖,它提供一個(gè)讀鎖,支持多個(gè)線(xiàn)程共享同一把鎖。這篇文章主要講解一下ReentrantReadWriteLock的使用和應(yīng)用場(chǎng)景,感興趣的可以了解一下
    2022-10-10
  • springboot prototype設(shè)置多例不起作用的解決操作

    springboot prototype設(shè)置多例不起作用的解決操作

    這篇文章主要介紹了springboot prototype設(shè)置多例不起作用的解決操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java中stream的用法詳細(xì)解讀

    Java中stream的用法詳細(xì)解讀

    這篇文章主要介紹了Java中stream的用法詳細(xì)解讀,Stream 是 Java8 中處理集合的關(guān)鍵抽象概念,它可以指定你希望對(duì)集合進(jìn)行的操作,可以執(zhí)行非常復(fù)雜的查找、過(guò)濾和映射數(shù)據(jù)等操作,使用Stream API 對(duì)集合數(shù)據(jù)進(jìn)行操作,就類(lèi)似于使用SQL執(zhí)行的數(shù)據(jù)庫(kù)查詢(xún),需要的朋友可以參考下
    2023-10-10
  • Java并發(fā)編程必備之Synchronized關(guān)鍵字深入解析

    Java并發(fā)編程必備之Synchronized關(guān)鍵字深入解析

    本文我們深入探索了Java中的Synchronized關(guān)鍵字,包括其互斥性和可重入性的特性,文章詳細(xì)介紹了Synchronized的三種使用方式:修飾代碼塊、修飾普通方法和修飾靜態(tài)方法,感興趣的朋友一起看看吧
    2025-04-04
  • 詳談Java中instanceof和isInstance的區(qū)別

    詳談Java中instanceof和isInstance的區(qū)別

    下面小編就為大家?guī)?lái)一篇詳談Java中instanceof和isInstance的區(qū)別。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • log4j 詳解異步日志的配置和測(cè)試

    log4j 詳解異步日志的配置和測(cè)試

    這篇文章主要介紹了 log4j 詳解異步日志的配置和測(cè)試的相關(guān)資料,需要的朋友可以參考下
    2017-01-01

最新評(píng)論

龙岩市| 金阳县| 台东市| 邹平县| 宿迁市| 巫溪县| 武山县| 玛多县| 濉溪县| 闸北区| 册亨县| 楚雄市| 广昌县| 黑河市| 龙海市| 贡觉县| 长泰县| 嵩明县| 神农架林区| 子洲县| 黎川县| 兰坪| 翁牛特旗| 乳山市| 芒康县| 乃东县| 南木林县| 沙湾县| 黄大仙区| 峨边| 尼勒克县| 长丰县| 西乌珠穆沁旗| 景泰县| 澄迈县| 封丘县| 石阡县| 咸丰县| 宁津县| 金平| 江西省|