亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot啟動(dòng)過(guò)程與自動(dòng)配置過(guò)程解讀

 更新時(shí)間:2025年08月25日 14:28:24   作者:沒(méi)事學(xué)AI  
本文詳解SpringBoot啟動(dòng)流程及自動(dòng)配置機(jī)制,涵蓋main方法初始化、環(huán)境配置、容器啟動(dòng)等關(guān)鍵步驟,解析條件注解與spring.factories的智能配置邏輯,并提供自定義配置方法,強(qiáng)調(diào)其"約定優(yōu)于配置"的核心理念與工程化封裝特性

一、Spring Boot 啟動(dòng)流程

Spring Boot 應(yīng)用的入口是 main 方法中的 SpringApplication.run(),但這行代碼背后藏著一整套“初始化-配置-啟動(dòng)”的流水線。

我們可以將其分為構(gòu)造階段運(yùn)行階段兩大步,每一步都有明確的職責(zé)邊界。

1.1 構(gòu)造階段:初始化核心組件

SpringApplication 實(shí)例的創(chuàng)建是啟動(dòng)的第一步,這個(gè)階段的核心是“搭骨架”——確定應(yīng)用類(lèi)型、加載初始化器和監(jiān)聽(tīng)器,為后續(xù)運(yùn)行鋪路。

  • 驗(yàn)證主類(lèi)合法性:通過(guò) Assert.notNull 確保傳入的主配置類(lèi)(標(biāo)注 @SpringBootApplication 的類(lèi))非空,這是整個(gè)應(yīng)用的“根”。
  • 推斷應(yīng)用類(lèi)型:通過(guò) WebApplicationType.deduceFromClasspath() 檢查類(lèi)路徑中是否存在 DispatcherServlet(MVC)或 DispatcherHandler(WebFlux),自動(dòng)判斷是 SERVLET、REACTIVE 還是非 Web 應(yīng)用(NONE)。
  • 加載初始化器與監(jiān)聽(tīng)器:從 META-INF/spring.factories 中讀取 ApplicationContextInitializerApplicationListener 的實(shí)現(xiàn)類(lèi)。這些組件是 Spring Boot 的“擴(kuò)展點(diǎn)”,例如初始化器可用于預(yù)先配置上下文,監(jiān)聽(tīng)器可監(jiān)聽(tīng)啟動(dòng)各階段事件。
  • 定位主程序類(lèi):通過(guò)棧追蹤找到調(diào)用 main 方法的類(lèi),作為應(yīng)用的入口標(biāo)記。

關(guān)鍵源碼片段

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    this.resourceLoader = resourceLoader;
    Assert.notNull(primarySources, "PrimarySources must not be null");
    this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
    this.webApplicationType = WebApplicationType.deduceFromClasspath();
    this.setInitializers(getSpringFactoriesInstances(ApplicationContextInitializer.class));
    this.setListeners(getSpringFactoriesInstances(ApplicationListener.class));
    this.mainApplicationClass = deduceMainApplicationClass();
}

1.2 運(yùn)行階段:從環(huán)境準(zhǔn)備到容器啟動(dòng)

SpringApplication.run() 方法是真正的“執(zhí)行引擎”,可細(xì)分為 10 個(gè)關(guān)鍵步驟,環(huán)環(huán)相扣:

  1. 啟動(dòng)監(jiān)控與監(jiān)聽(tīng)器:通過(guò) StopWatch 記錄啟動(dòng)時(shí)間,同時(shí)觸發(fā) SpringApplicationRunListeners.starting(),通知所有監(jiān)聽(tīng)器“應(yīng)用開(kāi)始啟動(dòng)”。
  2. 環(huán)境配置:創(chuàng)建 ConfigurableEnvironment(根據(jù)應(yīng)用類(lèi)型選擇 StandardServletEnvironmentStandardReactiveWebEnvironment),并加載系統(tǒng)變量、配置文件(如 application.yml)等。完成后調(diào)用 environmentPrepared 事件,允許監(jiān)聽(tīng)器對(duì)環(huán)境進(jìn)行二次調(diào)整。
  3. 打印 Banner:默認(rèn)打印 Spring Boot 版本信息,可通過(guò) resources/banner.txt 自定義(支持 ASCII 藝術(shù)或變量替換)。
  4. 創(chuàng)建應(yīng)用上下文:根據(jù)應(yīng)用類(lèi)型生成對(duì)應(yīng)的 IOC 容器,例如 Servlet 應(yīng)用使用 AnnotationConfigServletWebServerApplicationContext
  5. 上下文準(zhǔn)備:將環(huán)境、命令行參數(shù)等注入上下文,執(zhí)行初始化器的 initialize 方法,并觸發(fā) contextPrepared 事件。
  6. 上下文刷新:調(diào)用 refreshContext,觸發(fā) Spring 容器的核心流程(Bean 定義加載、實(shí)例化、依賴(lài)注入等),同時(shí)啟動(dòng)嵌入式服務(wù)器(如 Tomcat)。
  7. 收尾工作:執(zhí)行 afterRefresh(預(yù)留擴(kuò)展點(diǎn)),停止計(jì)時(shí)器,并觸發(fā) started 事件。
  8. 回調(diào)自定義邏輯:從容器中獲取 ApplicationRunnerCommandLineRunner 的實(shí)現(xiàn)類(lèi),按順序執(zhí)行其 run 方法(適合啟動(dòng)后初始化數(shù)據(jù)等操作)。
  9. 啟動(dòng)完成:觸發(fā) running 事件,應(yīng)用正式就緒。
  10. 異常處理:若啟動(dòng)失敗,調(diào)用 failed 事件,打印異常并關(guān)閉上下文。

實(shí)戰(zhàn)技巧:若需在啟動(dòng)后執(zhí)行初始化邏輯(如加載緩存),優(yōu)先使用 ApplicationRunner(支持 ApplicationArguments 解析)而非 CommandLineRunner(直接接收字符串?dāng)?shù)組)。

二、自動(dòng)配置:Spring Boot 的“智能配置”核心

Spring Boot 最令人稱(chēng)道的“自動(dòng)配置”,本質(zhì)是“基于條件的約定配置”。

它通過(guò)一套規(guī)則判斷環(huán)境中存在的依賴(lài),自動(dòng)裝配對(duì)應(yīng)的組件,避免手動(dòng)編寫(xiě) XML 或 @Bean 配置。

2.1 自動(dòng)配置的底層原理

自動(dòng)配置的觸發(fā)點(diǎn)是 @EnableAutoConfiguration 注解(被 @SpringBootApplication 間接包含),其核心邏輯在 AutoConfigurationImportSelector 中:

  1. 加載候選配置類(lèi):通過(guò) SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, classLoader),掃描所有 Jar 包的 META-INF/spring.factories,獲取 EnableAutoConfiguration 對(duì)應(yīng)的配置類(lèi)列表(如 HttpEncodingAutoConfiguration、DataSourceAutoConfiguration 等)。
  2. 過(guò)濾與去重:移除重復(fù)或被排除的配置類(lèi)(通過(guò) @SpringBootApplication(exclude = ...) 指定),再通過(guò)條件注解(如 @ConditionalOnClass)判斷配置類(lèi)是否生效。
  3. 注入容器:將生效的配置類(lèi)加載到容器中,其內(nèi)部的 @Bean 方法會(huì)自動(dòng)生成組件。

關(guān)鍵源碼片段

// AutoConfigurationImportSelector 中加載候選配置類(lèi)的邏輯
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
        getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories");
    return configurations;
}

2.2 條件注解:自動(dòng)配置的“開(kāi)關(guān)”

自動(dòng)配置的“智能”依賴(lài)于 @Conditional 系列注解,它們決定了一個(gè)配置類(lèi)或 @Bean 方法是否生效。

常用條件注解如下:

注解作用示例場(chǎng)景
@ConditionalOnClass類(lèi)路徑存在指定類(lèi)時(shí)生效檢測(cè)到 DataSource.class 時(shí)配置數(shù)據(jù)源
@ConditionalOnMissingBean容器中不存在指定 Bean 時(shí)生效若用戶未定義 RestTemplate,則自動(dòng)配置默認(rèn)實(shí)例
@ConditionalOnProperty配置項(xiàng)滿足條件時(shí)生效通過(guò) spring.datasource.enabled=true 控制數(shù)據(jù)源是否啟用
@ConditionalOnWebApplication僅 Web 應(yīng)用生效配置 DispatcherServlet

實(shí)戰(zhàn)案例:

HttpEncodingAutoConfiguration(HTTP 編碼自動(dòng)配置)的條件判斷:

@Configuration
@EnableConfigurationProperties(HttpProperties.class) // 綁定配置文件屬性
@ConditionalOnWebApplication(type = Type.SERVLET) // 僅 Servlet 應(yīng)用生效
@ConditionalOnClass(CharacterEncodingFilter.class) // 存在字符編碼過(guò)濾器類(lèi)時(shí)生效
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean // 若用戶未定義,則自動(dòng)配置
    public CharacterEncodingFilter characterEncodingFilter() {
        // 從 HttpProperties 中讀取配置(如 spring.http.encoding.charset=utf-8)
        CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();
        filter.setEncoding(properties.getCharset().name());
        return filter;
    }
}

技巧

若需禁用某個(gè)自動(dòng)配置(如默認(rèn)的數(shù)據(jù)源配置),可通過(guò)

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) 

或配置

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

2.3 自定義自動(dòng)配置:擴(kuò)展 Spring Boot

若需為自己的組件實(shí)現(xiàn)自動(dòng)配置(如公司內(nèi)部 SDK),需遵循以下步驟:

編寫(xiě)配置類(lèi):使用 @Configuration 和條件注解定義組件裝配邏輯,通過(guò) @EnableConfigurationProperties 綁定配置屬性。

注冊(cè)配置類(lèi):在 Jar 包的 META-INF/spring.factories 中添加:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.sdk.MyComponentAutoConfiguration

添加配置元數(shù)據(jù):在 META-INF/spring-configuration-metadata.json 中定義配置項(xiàng)的描述(IDE 會(huì)自動(dòng)提示),例如:

{
  "properties": [
    {
      "name": "example.sdk.enabled",
      "type": "java.lang.Boolean",
      "defaultValue": true,
      "description": "是否啟用 SDK 組件"
    }
  ]
}

驗(yàn)證方法:?jiǎn)?dòng)應(yīng)用時(shí)添加 --debug 參數(shù),控制臺(tái)會(huì)打印自動(dòng)配置報(bào)告,顯示哪些配置類(lèi)生效(Positive matches)或不生效(Negative matches)。

三、總結(jié):Spring Boot 便捷性的本質(zhì)

Spring Boot 的啟動(dòng)流程和自動(dòng)配置,本質(zhì)是“約定優(yōu)于配置”的極致體現(xiàn):

  • 啟動(dòng)流程通過(guò)標(biāo)準(zhǔn)化的步驟,將 Spring 容器的初始化與嵌入式服務(wù)器的啟動(dòng)無(wú)縫銜接,減少手動(dòng)干預(yù)。
  • 自動(dòng)配置基于條件注解和 spring.factories 機(jī)制,實(shí)現(xiàn)了“依賴(lài)驅(qū)動(dòng)配置”,讓開(kāi)發(fā)者專(zhuān)注于業(yè)務(wù)邏輯而非框架整合。

理解這些原理后,不僅能更高效地排查問(wèn)題(如啟動(dòng)慢、自動(dòng)配置失效),還能靈活擴(kuò)展 Spring Boot(如自定義 starters 或啟動(dòng)流程)。

記?。篠pring Boot 不是“魔法”,而是對(duì) Spring 框架的“工程化封裝”——看透其源碼,就能真正掌控它。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論