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

Spring?Boot?完整啟動(dòng)流程詳解

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

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

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

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

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

階段1:初始化啟動(dòng)計(jì)時(shí)器

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

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

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

階段3:環(huán)境準(zhǔ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);
  • 默認(rèn)打印SPRING BOOT字符Logo
  • 支持自定義banner.txt文件或完全禁用

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

context = createApplicationContext();

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

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

階段6:上下文預(yù)處理

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

??核心步驟:??

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

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

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

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

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

刷新階段重點(diǎn)說明:

??自動(dòng)裝配觸發(fā)點(diǎn)??(invokeBeanFactoryPostProcessors):

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

??嵌入式容器啟動(dòng)點(diǎn)??(onRefresh):

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

??Bean實(shí)例化點(diǎn)??(finishBeanFactoryInitialization):

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

階段8:刷新后處理

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

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

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

Runner執(zhí)行機(jī)制:

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啟動(dòng)流程全景圖

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

四、關(guān)鍵技術(shù)原理

1. 自動(dòng)裝配機(jī)制

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

2. 嵌入式容器啟動(dòng)

  1. ??Servle容器??:自動(dòng)探測并初始化Tomcat/Jetty/Undertow
  2. ??Reactive容器??:支持Netty/Reactor等
  3. ??啟動(dòng)時(shí)機(jī)??:在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

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

相關(guān)文章

  • Java 入門圖形用戶界面設(shè)計(jì)之事件處理上

    Java 入門圖形用戶界面設(shè)計(jì)之事件處理上

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

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

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

    java求余的技巧匯總

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

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

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

    Java基礎(chǔ)之自動(dòng)裝箱,注解操作示例

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

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

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

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

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

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

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

    Springboot整合GuavaCache緩存過程解析

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

    Java異常處理機(jī)制深入理解

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

最新評(píng)論

通许县| 济南市| 巨野县| 吕梁市| 航空| 和顺县| 五峰| 两当县| 吕梁市| 郎溪县| 都江堰市| 郎溪县| 文山县| 五指山市| 乡宁县| 靖江市| 万安县| 潮安县| 阿鲁科尔沁旗| 苏尼特左旗| 台东县| 云梦县| 福建省| 临澧县| 宁强县| 门源| 突泉县| 柳河县| 兴城市| 宾川县| 三门峡市| 梅河口市| 乌兰浩特市| 永新县| 四平市| 视频| 长沙县| 虞城县| 澄城县| 芦山县| 灵丘县|