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

SpringBoot實現(xiàn)自動配置全過程

 更新時間:2025年08月18日 11:31:09   作者:dj_master  
SpringBoot通過自動配置減少樣板代碼,基于條件注解和spring.factories篩選加載配置類,結合外部配置和自定義模塊實現(xiàn)靈活配置,提供調試工具排查問題

Spring Boot 的自動配置是其核心特性之一,通過 “約定優(yōu)于配置” 的原則,大幅減少了開發(fā)者需要編寫的樣板配置代碼。

下面從技術原理、關鍵組件和實現(xiàn)機制三個維度詳細解析:

一、核心技術原理

1.自動配置的觸發(fā)入口:@EnableAutoConfiguration

@SpringBootApplication 注解包含了 @EnableAutoConfiguration,它通過 @Import(AutoConfigurationImportSelector.class) 導入自動配置類:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
    // 排除特定的自動配置類
    Class<?>[] exclude() default {};
    String[] excludeName() default {};
}

2.AutoConfigurationImportSelector的工作流程

  • 加載候選配置類:從 META-INF/spring.factories 文件中讀取 EnableAutoConfiguration 對應的配置類列表。
  • 過濾配置類:基于 @Conditional 系列注解(如 @ConditionalOnClass、@ConditionalOnMissingBean)進行條件篩選,僅加載滿足條件的配置類。
  • 排序配置類:根據(jù) @AutoConfigureOrder@AutoConfigureBefore/@AutoConfigureAfter 注解確定加載順序。

二、關鍵組件與機制

1.spring.factories文件

位于各依賴的 META-INF 目錄下,定義了自動配置類的映射關系。

例如,spring-boot-autoconfigure 模塊中的 spring.factories 包含:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
...

2.條件注解(@Conditional)

自動配置類通過條件注解實現(xiàn) “按需加載”

  • @ConditionalOnClass:當類路徑中存在指定類時生效。
  • @ConditionalOnMissingBean:當容器中不存在指定 Bean 時生效。
  • @ConditionalOnProperty:基于配置屬性值生效。
  • @ConditionalOnWebApplication:在 Web 應用環(huán)境中生效。

示例WebMvcAutoConfiguration):

@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
public class WebMvcAutoConfiguration {
    // 配置方法...
}

3.配置屬性綁定(@ConfigurationProperties)

自動配置類通過 @ConfigurationProperties 綁定外部配置(如 application.properties):

@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
    private final Multipart multipart = new Multipart();
    
    // Getters/Setters
}

4.@AutoConfigureAfter和@AutoConfigureBefore

控制自動配置類的加載順序。

例如,DataSourceTransactionManagerAutoConfiguration 需在 DataSourceAutoConfiguration 之后加載:

@AutoConfigureAfter(DataSourceAutoConfiguration.class)
public class DataSourceTransactionManagerAutoConfiguration {
    // ...
}

三、自動配置的執(zhí)行流程

1.啟動階段觸發(fā)

當執(zhí)行 SpringApplication.run() 時,AutoConfigurationImportSelector 會被調用,加載所有候選自動配置類。

2.加載并過濾配置類

  • 讀取 spring.factories:從所有依賴的 META-INF/spring.factories 中收集 EnableAutoConfiguration 對應的配置類。
  • 條件評估:對每個配置類,基于 @Conditional 注解進行條件判斷,排除不滿足條件的類。

3.配置類實例化與 Bean 注冊

滿足條件的配置類會被實例化,其中的 @Bean 方法會向容器注冊組件。

例如,DataSourceAutoConfiguration 會在滿足條件時注冊數(shù)據(jù)源 Bean:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class,
        DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {
    
    @Bean
    @ConditionalOnMissingBean
    public DataSource dataSource(DataSourceProperties properties) {
        // 根據(jù)配置創(chuàng)建數(shù)據(jù)源
        return properties.initializeDataSourceBuilder().build();
    }
}

4.用戶配置覆蓋

自動配置的 Bean 通常使用 @ConditionalOnMissingBean 注解,允許用戶通過自定義 Bean 覆蓋默認配置。

例如,用戶自定義 DataSource Bean 會優(yōu)先于自動配置的數(shù)據(jù)源。

四、自定義自動配置

開發(fā)者可通過以下步驟創(chuàng)建自定義自動配置模塊:

  • 創(chuàng)建配置類:使用 @Configuration@Conditional 注解定義配置邏輯。
  • 綁定配置屬性:通過 @ConfigurationProperties 讀取外部配置。
  • 注冊到 spring.factories:在項目的 META-INF/spring.factories 中添加:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.MyAutoConfiguration

五、調試與排查工具

啟用自動配置報告:在 application.properties 中添加:

debug=true

啟動日志會輸出自動配置的詳細報告,包括哪些配置被應用、哪些被排除及原因。

使用 ConditionEvaluationReport:通過 actuator 端點 /conditions 查看條件評估結果。

總結:自動配置的本質

Spring Boot 的自動配置是 “基于條件的 Bean 注冊機制”,通過以下要素實現(xiàn):

  • 約定優(yōu)于配置:默認配置覆蓋常見場景,減少手動配置。
  • 條件化加載:通過 @Conditional 注解實現(xiàn)按需加載。
  • 外部化配置:通過 @ConfigurationPropertiesapplication.properties 綁定。
  • 可擴展性:允許用戶通過自定義 Bean 或自動配置模塊覆蓋默認行為。

這種機制使 Spring Boot 能夠 “智能推斷” 應用需要的組件,并自動完成配置,讓開發(fā)者專注于業(yè)務邏輯而非基礎設施搭建。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java無法輸出中文問題及解決

    Java無法輸出中文問題及解決

    這篇文章主要介紹了Java無法輸出中文問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • java獲取http請求的Header和Body的簡單方法

    java獲取http請求的Header和Body的簡單方法

    下面小編就為大家?guī)硪黄猨ava獲取http請求的Header和Body的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Java通過Socket實現(xiàn)簡單多人聊天室

    Java通過Socket實現(xiàn)簡單多人聊天室

    這篇文章主要為大家詳細介紹了Java通過Socket實現(xiàn)簡單多人聊天室,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • springboot系統(tǒng)首頁自動跳轉拼接到index的實現(xiàn)

    springboot系統(tǒng)首頁自動跳轉拼接到index的實現(xiàn)

    文章介紹了通過訪問http://localhost:8091時,服務器會動態(tài)跳轉到系統(tǒng)的歡迎頁面,實現(xiàn)原理是在程序啟動時自動加載默認的請求路徑,并動態(tài)拼接前綴和后綴,最終指向./WEB-INF/views/index.jsp,作者分享了這一經驗,并希望得到大家的支持
    2025-11-11
  • java實現(xiàn)省市區(qū)三級聯(lián)動

    java實現(xiàn)省市區(qū)三級聯(lián)動

    這篇文章主要為大家詳細介紹了java實現(xiàn)省市區(qū)三級聯(lián)動,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • Spring Boot 核心模塊詳解(12 個模塊詳解及作用說明)

    Spring Boot 核心模塊詳解(12 個模塊詳解及作用說明)

    和 Spring 框架一樣,Spring Boot 框架也是由許多核心模塊組成的,每個模塊負責不同的功能點,本文講著重于介紹 Spring Boot 相關的 12 個模塊的作用和功能,感興趣的朋友一起看看吧
    2025-04-04
  • java.lang.OutOfMemoryError 錯誤整理及解決辦法

    java.lang.OutOfMemoryError 錯誤整理及解決辦法

    這篇文章主要介紹了java.lang.OutOfMemoryError 錯誤整理及解決辦法的相關資料,需要的朋友可以參考下
    2016-10-10
  • SpringBoot項目統(tǒng)一枚舉轉換實踐過程

    SpringBoot項目統(tǒng)一枚舉轉換實踐過程

    文章介紹了在Spring Boot項目中統(tǒng)一枚舉轉換的實踐,通過使用自定義的父枚舉接口和AttributeConverter、ConverterFactory、JsonSerializer和JsonDeserializer等工具,實現(xiàn)了枚舉與數(shù)據(jù)庫、請求參數(shù)、響應參數(shù)和消息參數(shù)之間的自動轉換
    2024-12-12
  • Java線程取消的三種方式

    Java線程取消的三種方式

    文章介紹了 Java 線程取消的 3 種方式,不推薦使用 stop 方法和 volatile 設標記位停止線程,線程中斷機制是協(xié)作式的,一個線程請求中斷,另一線程響應,線程可檢查自身中斷狀態(tài)或捕獲 InterruptedException 來合適處理以響應中斷,確保安全有序停止,避免資源泄露等問題
    2024-12-12
  • zookeeper服務優(yōu)化的一些建議

    zookeeper服務優(yōu)化的一些建議

    今天小編就為大家分享一篇關于zookeeper服務優(yōu)化的一些建議,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03

最新評論

中方县| 垣曲县| 宝鸡市| 柳江县| 右玉县| 漠河县| 若尔盖县| 华容县| 星子县| 乐业县| 双城市| 巧家县| 阿克陶县| 沙洋县| 闽侯县| 乐清市| 恩施市| 偃师市| 台江县| 德江县| 崇阳县| 缙云县| 视频| 周至县| 桃源县| 抚州市| 宁陵县| 平顶山市| 丰顺县| 营口市| 屯留县| 万山特区| 虞城县| 司法| 名山县| 贵溪市| 青河县| 公安县| 托克逊县| 汕头市| 阿拉尔市|