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

Spring?Boot?完整啟動流程詳解

 更新時間:2025年09月12日 10:58:00   作者:敬將來的自己  
本文完整解析Spring Boot啟動流程的9個核心階段,結(jié)合源碼與實戰(zhàn)場景,幫助開發(fā)者深入理解框架運行機制,感興趣的朋友跟隨小編一起看看吧

本文完整解析 Spring Boot 啟動流程的 9 個核心階段,結(jié)合源碼與實戰(zhàn)場景,幫助開發(fā)者深入理解框架運行機制。適用于面試準備和技術原理學習。

一、啟動入口:SpringApplication.run()

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

二、完整啟動流程(9大核心階段)

階段1:初始化啟動計時器

StopWatch stopWatch = new StopWatch();
stopWatch.start();

階段2:監(jiān)聽器初始化與啟動事件

SpringApplicationRunListeners listeners = getRunListeners(args);
listeners.starting(); // 發(fā)布ApplicationStartingEvent
  • ??作用??:通知所有SpringApplicationRunListener啟動開始
  • ??擴展點??:可自定義監(jiān)聽器實現(xiàn)初始化日志、監(jiān)控等操作

階段3:環(huán)境準備與環(huán)境事件

ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArgs);
graph TD
    A[創(chuàng)建Environment對象] --> B[加載配置源]
    B --> C[解析Profile配置]
    C --> D[轉(zhuǎn)換配置屬性]
    D --> E[發(fā)布ApplicationEnvironmentPreparedEvent]

階段4:打印Banner

Banner printedBanner = printBanner(environment);
  • 默認打印SPRING BOOT字符Logo
  • 支持自定義banner.txt文件或完全禁用

階段5:創(chuàng)建應用上下文

context = createApplicationContext();

??上下文類型判斷邏輯:??

protected ConfigurableApplicationContext createApplicationContext() {
    return switch (this.webApplicationType) {
        case SERVLET -> new AnnotationConfigServletWebServerApplicationContext();
        case REACTIVE -> new AnnotationConfigReactiveWebServerApplicationContext();
        default -> new AnnotationConfigApplicationContext(); // 非Web應用
    };
}

階段6:上下文預處理

prepareContext(context, environment, listeners, appArgs, printedBanner);

??核心步驟:??

  1. 關聯(lián)環(huán)境配置到上下文
  2. 應用ApplicationContextInitializer擴展點
  3. 發(fā)布ApplicationContextInitializedEvent
  4. 注冊主配置類(@SpringBootApplication注解類)
  5. 發(fā)布ApplicationPreparedEvent

階段7:★★★ 核心刷新階段 ★★★

refreshContext(context); // 內(nèi)部調(diào)用Spring的refresh()

??Spring Framework的12步刷新流程:??

public void refresh() {
    // 1. 準備刷新
    prepareRefresh();
    // 2. 獲取BeanFactory
    ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    // 3. 準備BeanFactory
    prepareBeanFactory(beanFactory);
    try {
        // 4. 后置處理BeanFactory
        postProcessBeanFactory(beanFactory);
        // 5. ★★★ 執(zhí)行BeanFactoryPostProcessor(自動配置入口)
        invokeBeanFactoryPostProcessors(beanFactory);
        // 6. 注冊BeanPostProcessor
        registerBeanPostProcessors(beanFactory);
        // 7. 初始化消息源
        initMessageSource();
        // 8. 初始化事件廣播器
        initApplicationEventMulticaster();
        // 9. ★ Web容器啟動關鍵步驟
        onRefresh();
        // 10. 注冊監(jiān)聽器
        registerListeners();
        // 11. ★★★ 實例化所有非延遲單例Bean
        finishBeanFactoryInitialization(beanFactory);
        // 12. 完成刷新
        finishRefresh();
    } catch (BeansException ex) {
        // 異常處理...
    }
}

刷新階段重點說明:

??自動裝配觸發(fā)點??(invokeBeanFactoryPostProcessors):

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
    PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(
        beanFactory, getBeanFactoryPostProcessors());
    // 這里會處理@SpringBootApplication->加載自動配置類
}

??嵌入式容器啟動點??(onRefresh):

protected void onRefresh() {
    super.onRefresh();
    try {
        createWebServer(); // 啟動Tomcat/Jetty
    } catch (Throwable ex) {
        throw new ApplicationContextException("Unable to start web server", ex);
    }
}

??Bean實例化點??(finishBeanFactoryInitialization):

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    // 初始化所有非延遲單例Bean
    beanFactory.preInstantiateSingletons();
}

階段8:刷新后處理

afterRefresh(context, appArgs);
  • ??默認空方法??,開發(fā)人員可重寫實現(xiàn)自定義邏輯
  • 典型應用:初始化數(shù)據(jù)庫數(shù)據(jù)、啟動定時任務等

階段9:事件通知與Runner執(zhí)行

stopWatch.stop();
listeners.started(context); // ApplicationStartedEvent
callRunners(context, appArgs); // 執(zhí)行ApplicationRunner/CommandLineRunner
listeners.running(context); // ApplicationReadyEvent

Runner執(zhí)行機制:

private void callRunners(ApplicationContext context, ApplicationArguments args) {
    List<Object> runners = new ArrayList<>();
    runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
    runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
    AnnotationAwareOrderComparator.sort(runners);
    for (Object runner : runners) {
        if (runner instanceof ApplicationRunner) {
            ((ApplicationRunner) runner).run(args);
        }
        if (runner instanceof CommandLineRunner) {
            ((CommandLineRunner) runner).run(args.getSourceArgs());
        }
    }
}

三、Spring Boot啟動流程全景圖

graph TD
    A[SpringApplication.run] --> B[啟動計時器]
    B --> C[初始化監(jiān)聽器]
    C --> D[發(fā)布StartingEvent]
    D --> E[準備Environment]
    E --> F[打印Banner]
    F --> G[創(chuàng)建上下文]
    G --> H[預處理上下文]
    H --> I[refreshContext核心]
    I --> J[后置處理]
    J --> K[發(fā)布StartedEvent]
    K --> L[執(zhí)行Runner]
    L --> M[發(fā)布ReadyEvent]

四、關鍵技術原理

1. 自動裝配機制

  1. 通過@EnableAutoConfiguration引入自動配置
  2. AutoConfigurationImportSelector掃描META-INF/spring.factories
  3. 使用@Conditional系列注解實現(xiàn)條件裝配

2. 嵌入式容器啟動

  1. ??Servle容器??:自動探測并初始化Tomcat/Jetty/Undertow
  2. ??Reactive容器??:支持Netty/Reactor等
  3. ??啟動時機??:在onRefresh()階段創(chuàng)建WebServer

3. 配置加載順序

1. 命令行參數(shù)
2. 系統(tǒng)環(huán)境變量
3. JNDI屬性
4. Java系統(tǒng)屬性
5. Profile-specific配置(application-{profile}.yml)
6. 主配置文件(application.yml)
7. @Configuration注解的@PropertySource
8. SpringApplication.setDefaultProperties

到此這篇關于Spring Boot 啟動流程詳解的文章就介紹到這了,更多相關Spring Boot 啟動流程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java 入門圖形用戶界面設計之事件處理上

    Java 入門圖形用戶界面設計之事件處理上

    圖形界面(簡稱GUI)是指采用圖形方式顯示的計算機操作用戶界面。與早期計算機使用的命令行界面相比,圖形界面對于用戶來說在視覺上更易于接受,本篇精講Java語言中關于圖形用戶界面的事件處理
    2022-02-02
  • Spring Cloud Gateway 獲取請求體(Request Body)的多種方法

    Spring Cloud Gateway 獲取請求體(Request Body)的多種方法

    這篇文章主要介紹了Spring Cloud Gateway 獲取請求體(Request Body)的多種方法,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • java求余的技巧匯總

    java求余的技巧匯總

    這篇文章主要給大家介紹了關于java求余技巧的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • Java實現(xiàn)替換PDF中的字體功能

    Java實現(xiàn)替換PDF中的字體功能

    文檔中可通過應用不同的字體來呈現(xiàn)不一樣的視覺效果,通過字體來實現(xiàn)文檔布局、排版等設計需要。本文將詳細為大家介紹如何利用Java實現(xiàn)替換PDF文中的字體,需要的可以參考一下
    2022-03-03
  • Java基礎之自動裝箱,注解操作示例

    Java基礎之自動裝箱,注解操作示例

    這篇文章主要介紹了Java基礎之自動裝箱,注解操作,結(jié)合實例形式分析了java拆箱、裝箱、靜態(tài)導入、注釋等相關使用技巧,需要的朋友可以參考下
    2019-08-08
  • MyBatis Mapper.xml入?yún)ist使用in函數(shù)問題

    MyBatis Mapper.xml入?yún)ist使用in函數(shù)問題

    文章主要講述了在使用MyBatis的Mapper.xml文件時,如何正確地在in函數(shù)中使用List作為入?yún)?作者強調(diào)了完整拷貝<if>...</if>格式的重要性,并指出稍微的改動就會導致錯誤
    2025-02-02
  • SpringBoot實現(xiàn)Logback輸出日志到Kafka方式

    SpringBoot實現(xiàn)Logback輸出日志到Kafka方式

    本文介紹了如何在SpringBoot應用中通過自定義Appender實現(xiàn)Logback輸出日志到Kafka,包括配置maven依賴、Kafka工具類和logback.xml配置
    2025-02-02
  • SpringBoot調(diào)用對方webService接口的幾種方法示例

    SpringBoot調(diào)用對方webService接口的幾種方法示例

    平常我們開發(fā)調(diào)用接口一般會用到幾種數(shù)據(jù)格式,比如有restful的,這個是目前最流行的,也是最簡單開發(fā)的,還有一種就是webservice數(shù)據(jù)格式,本文給大家介紹了幾種SpringBoot調(diào)用對方webService接口的方法,文中有相關的代碼示例供大家參考,需要的朋友可以參考下
    2023-11-11
  • Springboot整合GuavaCache緩存過程解析

    Springboot整合GuavaCache緩存過程解析

    這篇文章主要介紹了springboot整合GuavaCache緩存過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-02-02
  • Java異常處理機制深入理解

    Java異常處理機制深入理解

    如果某個方法不能按照正常的途徑完成任務,就可以通過另一種路徑退出方法。在這種情況下會拋出一個封裝了錯誤信息的對象。此時,這個方法會立刻退出同時不返回任何值。另外,調(diào)用這個方法的其他代碼也無法繼續(xù)執(zhí)行,異常處理機制會將代碼執(zhí)行交給異常處理器
    2022-01-01

最新評論

耒阳市| 蒙自县| 辛集市| 宣恩县| 夏邑县| 夏邑县| 化德县| 松桃| 陆良县| 田东县| 临泉县| 同心县| 济宁市| 济宁市| 陕西省| 镇原县| 孟连| 望江县| 磴口县| 瑞丽市| 商河县| 五常市| 湖北省| 辰溪县| 江口县| 宁陕县| 历史| 屯留县| 昌乐县| 龙陵县| 和平县| 仁寿县| 那坡县| 博罗县| 闵行区| 鄂托克旗| 襄垣县| 潞西市| 分宜县| 南宫市| 阳江市|