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

Spring Boot 自動(dòng)配置的底層實(shí)現(xiàn)原理深度解析

 更新時(shí)間:2025年12月17日 16:19:05   作者:阿拉斯攀登  
SpringBoot自動(dòng)配置的核心在于通過“約定+條件判斷”實(shí)現(xiàn)配置的自動(dòng)化加載與生效,其底層實(shí)現(xiàn)可以拆解為觸發(fā)入口、配置類加載、條件過濾、Bean注冊和配置覆蓋五個(gè)核心環(huán)節(jié),本文介紹Spring Boot自動(dòng)配置的底層實(shí)現(xiàn)原理,感興趣的朋友一起看看吧

Spring Boot 自動(dòng)配置的核心是基于 Spring 框架的擴(kuò)展能力,通過 “約定 + 條件判斷” 實(shí)現(xiàn)配置的自動(dòng)化加載與生效,其底層實(shí)現(xiàn)可拆解為「觸發(fā)入口 → 配置類加載 → 條件過濾 → Bean 注冊 → 配置覆蓋」五個(gè)核心環(huán)節(jié),每個(gè)環(huán)節(jié)都依賴特定的 Spring 機(jī)制和 Boot 擴(kuò)展,以下是逐環(huán)節(jié)的底層原理解析:

一、核心前置知識(shí)

在拆解原理前,需明確兩個(gè)基礎(chǔ)支撐:

  1. Spring 注解驅(qū)動(dòng):Spring 3.0+ 引入的 @Configuration、@Bean、@Import 等注解,替代傳統(tǒng) XML 配置,為自動(dòng)配置提供基礎(chǔ);
  2. Spring 條件注解:Spring 4.0+ 引入的 @Conditional 注解,允許根據(jù)條件動(dòng)態(tài)注冊 Bean,是自動(dòng)配置 “按需生效” 的核心;
  3. Spring Boot 起步依賴:通過 Maven/Gradle 的依賴傳遞,將特定場景的核心依賴打包(如 spring-boot-starter-web 包含 spring-webmvc、Tomcat 等),為自動(dòng)配置提供 “依賴觸發(fā)” 的基礎(chǔ)。

二、自動(dòng)配置的完整底層流程

1. 觸發(fā)入口:@SpringBootApplication 注解

自動(dòng)配置的 “總開關(guān)” 是 @SpringBootApplication,它是一個(gè)組合注解,核心子注解為 @EnableAutoConfiguration,其底層結(jié)構(gòu)決定了自動(dòng)配置的啟動(dòng)邏輯:

// 核心組合注解結(jié)構(gòu)(簡化版)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Configuration // 標(biāo)記為 Spring 配置類
@EnableAutoConfiguration // 核心:開啟自動(dòng)配置
@ComponentScan // 掃描業(yè)務(wù)組件(@Controller/@Service 等)
public @interface SpringBootApplication {
    // 排除指定自動(dòng)配置類
    Class<?>[] exclude() default {};
}

關(guān)鍵@EnableAutoConfiguration 是觸發(fā)自動(dòng)配置的核心,它通過 @Import 導(dǎo)入 AutoConfigurationImportSelector 類,完成自動(dòng)配置類的加載。

2. 配置類加載:AutoConfigurationImportSelector 核心邏輯

AutoConfigurationImportSelector 實(shí)現(xiàn)了 Spring 的 DeferredImportSelector 接口(延遲導(dǎo)入,保證依賴順序),其核心方法是 selectImports(),完整流程如下:

步驟 1:讀取自動(dòng)配置類清單(核心文件)

Spring Boot 2.7+ 版本中,自動(dòng)配置類的清單存儲(chǔ)在 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中(2.7 之前是 META-INF/spring.factories)。該文件由 Spring Boot 內(nèi)置,包含數(shù)百個(gè)自動(dòng)配置類的全限定名,例如:

plaintext

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
org.springframework.boot.autoconfigure.redis.RedisAutoConfiguration
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

AutoConfigurationImportSelector 通過 loadFactoryNames() 方法讀取該文件,獲取所有候選自動(dòng)配置類。

步驟 2:過濾自動(dòng)配置類(核心過濾規(guī)則)

讀取到候選配置類后,會(huì)通過以下規(guī)則過濾,只保留 “符合當(dāng)前環(huán)境” 的配置類:

過濾規(guī)則實(shí)現(xiàn)邏輯
排除用戶指定的類讀取 @SpringBootApplication 的 exclude 屬性,排除指定類
基于注解元數(shù)據(jù)過濾解析配置類上的 @Conditional 條件注解(如 @ConditionalOnClass),提前過濾不滿足條件的類
基于依賴存在性過濾檢查類路徑中是否存在配置類依賴的核心類(如 DataSourceAutoConfiguration 依賴 DataSource.class
基于啟用開關(guān)過濾檢查 spring.boot.enableautoconfiguration 屬性是否為 true(默認(rèn)開啟)

步驟 3:排序并導(dǎo)入配置類

過濾后的配置類會(huì)按 “依賴順序” 排序(例如:數(shù)據(jù)源配置先于 ORM 配置),最終通過 Spring 的 BeanDefinitionRegistry 導(dǎo)入到 Spring 容器中。

3. 條件控制:@Conditional 注解家族(自動(dòng)配置的 “開關(guān)”)

導(dǎo)入的自動(dòng)配置類并非直接生效,而是通過 Spring Boot 擴(kuò)展的條件注解 控制 Bean 的注冊時(shí)機(jī),這是自動(dòng)配置 “按需生效” 的核心。

核心條件注解的底層實(shí)現(xiàn)

所有條件注解都基于 Spring 核心的 @Conditional 注解,Spring Boot 擴(kuò)展了以下常用條件注解,其底層實(shí)現(xiàn)邏輯如下:

注解底層實(shí)現(xiàn)原理
@ConditionalOnClass通過 ClassLoader 檢查類路徑中是否存在指定類,若不存在則跳過當(dāng)前配置類
@ConditionalOnMissingClass與 @ConditionalOnClass 相反,檢查類路徑中是否不存在指定類
@ConditionalOnBean通過 BeanFactory 檢查 Spring 容器中是否存在指定 Bean(按類型 / 名稱)
@ConditionalOnMissingBean檢查容器中是否不存在指定 Bean(允許用戶自定義 Bean 覆蓋默認(rèn)配置)
@ConditionalOnProperty讀取 Environment 中的配置屬性(如 application.yml),判斷屬性是否存在且值匹配
@ConditionalOnWebApplication檢查當(dāng)前應(yīng)用是否為 Web 應(yīng)用(通過 WebApplicationType 判斷:SERVLET/REACTIVE/NONE)

示例:DispatcherServletAutoConfiguration 的條件控制

// 僅當(dāng)類路徑中有 DispatcherServlet 類時(shí)生效(引入 spring-webmvc 才滿足)
@ConditionalOnClass(DispatcherServlet.class)
// 僅當(dāng)當(dāng)前應(yīng)用是 Web 應(yīng)用(SERVLET 類型)時(shí)生效
@ConditionalOnWebApplication(type = Type.SERVLET)
// 綁定 Spring MVC 配置屬性
@EnableConfigurationProperties(WebMvcProperties.class)
public class DispatcherServletAutoConfiguration {
    // 初始化 DispatcherServlet Bean(僅當(dāng)容器中不存在時(shí))
    @Bean
    @ConditionalOnMissingBean(DispatcherServlet.class)
    public DispatcherServlet dispatcherServlet(WebMvcProperties properties) {
        DispatcherServlet servlet = new DispatcherServlet();
        servlet.setDispatchOptionsRequest(properties.isDispatchOptionsRequest());
        return servlet;
    }
}

底層邏輯:只有引入 spring-boot-starter-web(包含 DispatcherServlet.class),且當(dāng)前是 Servlet 類型 Web 應(yīng)用,且用戶未自定義 DispatcherServlet Bean 時(shí),才會(huì)自動(dòng)初始化默認(rèn)的 DispatcherServlet。

4. Bean 注冊:自動(dòng)配置類的執(zhí)行

通過條件過濾后的自動(dòng)配置類,會(huì)被 Spring 容器解析為 ConfigurationClass,并執(zhí)行以下操作:

  1. 解析 @Bean 注解:自動(dòng)配置類中的 @Bean 方法會(huì)被解析,生成 BeanDefinition;
  2. 屬性綁定:通過 @EnableConfigurationProperties 將配置文件中的屬性(如 spring.datasource.*)綁定到屬性類(如 DataSourceProperties);
  3. Bean 初始化:Spring 容器根據(jù) BeanDefinition 初始化 Bean,注入到容器中(如 DataSource、DispatcherServlet 等)。

5. 配置覆蓋:用戶自定義配置優(yōu)先

Spring Boot 保證 “用戶配置> 自動(dòng)配置”,底層通過以下機(jī)制實(shí)現(xiàn):

  1. @ConditionalOnMissingBean:自動(dòng)配置類中的 Bean 僅在容器中不存在時(shí)才初始化,用戶自定義的同名 Bean 會(huì)覆蓋默認(rèn) Bean;
  2. 屬性優(yōu)先級(jí):自動(dòng)配置的 Bean 會(huì)讀取配置文件中的屬性,用戶可通過 application.yml 覆蓋默認(rèn)屬性(如 spring.datasource.url 覆蓋默認(rèn)數(shù)據(jù)源地址);
  3. Bean 定義優(yōu)先級(jí):用戶自定義的 @Configuration 類會(huì)優(yōu)先于自動(dòng)配置類執(zhí)行,其 Bean 定義會(huì)覆蓋自動(dòng)配置的 Bean 定義;
  4. 排除自動(dòng)配置類:通過 @SpringBootApplication(exclude = XXXAutoConfiguration.class) 可直接禁用指定自動(dòng)配置類,徹底避免默認(rèn)配置生效。

三、核心底層類與接口總結(jié)

類 / 接口作用
@EnableAutoConfiguration開啟自動(dòng)配置的核心注解,導(dǎo)入 AutoConfigurationImportSelector
AutoConfigurationImportSelector加載并過濾自動(dòng)配置類,實(shí)現(xiàn) DeferredImportSelector 接口
Condition/ConditionContext條件注解的核心接口,Condition 定義條件判斷邏輯,ConditionContext 提供上下文(類加載器、BeanFactory 等)
ConfigurationClassPostProcessorSpring 內(nèi)置后置處理器,解析 @Configuration 類,注冊 BeanDefinition
EnableConfigurationPropertiesRegistrar綁定配置屬性類,將 @ConfigurationProperties 類注冊為 Bean

四、自動(dòng)配置原理的關(guān)鍵結(jié)論

  1. 核心邏輯:自動(dòng)配置是 “讀取配置類清單 → 條件過濾 → 動(dòng)態(tài)注冊 Bean” 的過程,完全基于 Spring 注解驅(qū)動(dòng)擴(kuò)展,無黑魔法;
  2. 觸發(fā)基礎(chǔ):依賴 “起步依賴” 引入核心類,通過 @ConditionalOnClass 觸發(fā)對應(yīng)配置類;
  3. 靈活性保障:通過 @ConditionalOnMissingBean、配置屬性覆蓋、排除配置類等機(jī)制,保證用戶可靈活定制;
  4. 執(zhí)行順序:自動(dòng)配置類延遲加載(DeferredImportSelector),保證用戶配置優(yōu)先于自動(dòng)配置執(zhí)行。

五、調(diào)試自動(dòng)配置的底層方法

若需驗(yàn)證自動(dòng)配置的執(zhí)行過程,可通過以下方式調(diào)試:

  1. 開啟調(diào)試日志:在 application.yml 中添加 debug: true,控制臺(tái)會(huì)輸出「AutoConfiguration Report」,包含生效 / 未生效的配置類及原因;
  2. 斷點(diǎn)調(diào)試:在 AutoConfigurationImportSelector.selectImports() 方法打斷點(diǎn),查看加載的配置類清單;
  3. 查看 Bean 定義:通過 ApplicationContext.getBeanDefinitionNames() 打印所有注冊的 Bean,驗(yàn)證自動(dòng)配置的 Bean 是否存在;
  4. 分析類路徑:通過 mvn dependency:tree 查看依賴,確認(rèn)是否引入自動(dòng)配置所需的核心類。

理解自動(dòng)配置的底層原理后,不僅能解決 “配置不生效” 的問題,還能基于該原理開發(fā)自定義 Starter,實(shí)現(xiàn)通用功能的自動(dòng)配置。

到此這篇關(guān)于Spring Boot 自動(dòng)配置的底層實(shí)現(xiàn)原理的文章就介紹到這了,更多相關(guān)Spring Boot 自動(dòng)配置原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用java數(shù)組 封裝自己的數(shù)組操作示例

    使用java數(shù)組 封裝自己的數(shù)組操作示例

    這篇文章主要介紹了使用java數(shù)組 封裝自己的數(shù)組操作,結(jié)合實(shí)例形式分析了java數(shù)組索引、遍歷等相關(guān)封裝操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2020-03-03
  • 關(guān)于ElasticSearch的常用增刪改查DSL和代碼

    關(guān)于ElasticSearch的常用增刪改查DSL和代碼

    這篇文章主要介紹了關(guān)于ElasticSearch的常用增刪改查DSL和代碼,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Java集成大模型LangChain4j實(shí)戰(zhàn)完全指南(推薦)

    Java集成大模型LangChain4j實(shí)戰(zhàn)完全指南(推薦)

    LangChain4j 的目標(biāo)是簡化將大語言模型(LLM - Large Language Model)集成到Java應(yīng)用程序中的過程,本文給大家介紹Java集成大模型LangChain4j實(shí)戰(zhàn)完全指南,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • 實(shí)例講解Java批量插入、更新數(shù)據(jù)

    實(shí)例講解Java批量插入、更新數(shù)據(jù)

    這片文章介紹了一個(gè)Java批量添加數(shù)據(jù),多個(gè)字段同時(shí)添加多條數(shù)據(jù)具體實(shí)例,面向的是Oracle數(shù)據(jù)庫,需要的朋友可以參考下
    2015-07-07
  • java socket接收保證能讀完數(shù)據(jù)的實(shí)例

    java socket接收保證能讀完數(shù)據(jù)的實(shí)例

    這篇文章主要介紹了java socket接收保證能讀完數(shù)據(jù)的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 關(guān)于Struts2文件上傳與自定義攔截器

    關(guān)于Struts2文件上傳與自定義攔截器

    本篇文章,小編將為大家介紹關(guān)于Struts2文件上傳與自定義攔截器,有需要的朋友可以參考一下
    2013-04-04
  • SpringBoot Mybatis多數(shù)據(jù)源配置全過程

    SpringBoot Mybatis多數(shù)據(jù)源配置全過程

    本文詳細(xì)介紹了如何在Java項(xiàng)目中配置多數(shù)據(jù)源,包括配置文件設(shè)置、多數(shù)據(jù)源配置類、MyBatis配置等,通過兩種不同的方式配置primary和secondary數(shù)據(jù)源,展示了如何處理Mapper接口文件和.xml文件不在同一目錄下的情況,并使用@Primary注解指定默認(rèn)數(shù)據(jù)源
    2025-11-11
  • springboot對接微信支付的完整流程(附前后端代碼)

    springboot對接微信支付的完整流程(附前后端代碼)

    最近在做支付平臺(tái)的項(xiàng)目,承接公司業(yè)務(wù)系統(tǒng)與第三方支付平臺(tái)的對接任務(wù),主要涉及微信支付、支付寶支付以及理房通支付等第三方平臺(tái),這篇文章主要給大家介紹了關(guān)于springboot對接微信支付的完整流程,需要的朋友可以參考下
    2021-08-08
  • SpringBoot與Spring之間的對比

    SpringBoot與Spring之間的對比

    這篇文章主要介紹了SpringBoot與Spring之間的對比,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Spring Boot Admin Server管理客戶端過程詳解

    Spring Boot Admin Server管理客戶端過程詳解

    這篇文章主要介紹了Spring Boot Admin Server管理客戶端過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03

最新評(píng)論

惠水县| 陆川县| 华蓥市| 富阳市| 囊谦县| 新田县| 万安县| 桐城市| 长兴县| 游戏| 肥西县| 鄂托克前旗| 娄底市| 五指山市| 顺义区| 哈密市| 搜索| 治县。| 眉山市| 新田县| 开鲁县| 泸溪县| 武安市| 龙州县| 于都县| 汉阴县| 灵山县| 太湖县| 东兴市| 阿合奇县| 田阳县| 吉木乃县| 蓬莱市| 资源县| 南郑县| 周宁县| 屏东县| 长沙县| 稻城县| 密山市| 温州市|