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

SpringBoot實(shí)現(xiàn)自動(dòng)配置全過(guò)程

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

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

下面從技術(shù)原理、關(guān)鍵組件和實(shí)現(xiàn)機(jī)制三個(gè)維度詳細(xì)解析:

一、核心技術(shù)原理

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

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

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

2.AutoConfigurationImportSelector的工作流程

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

二、關(guān)鍵組件與機(jī)制

1.spring.factories文件

位于各依賴的 META-INF 目錄下,定義了自動(dòng)配置類的映射關(guān)系。

例如,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)

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

  • @ConditionalOnClass:當(dāng)類路徑中存在指定類時(shí)生效。
  • @ConditionalOnMissingBean:當(dāng)容器中不存在指定 Bean 時(shí)生效。
  • @ConditionalOnProperty:基于配置屬性值生效。
  • @ConditionalOnWebApplication:在 Web 應(yīng)用環(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)

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

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

4.@AutoConfigureAfter和@AutoConfigureBefore

控制自動(dòng)配置類的加載順序。

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

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

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

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

當(dāng)執(zhí)行 SpringApplication.run() 時(shí),AutoConfigurationImportSelector 會(huì)被調(diào)用,加載所有候選自動(dòng)配置類。

2.加載并過(guò)濾配置類

  • 讀取 spring.factories:從所有依賴的 META-INF/spring.factories 中收集 EnableAutoConfiguration 對(duì)應(yīng)的配置類。
  • 條件評(píng)估:對(duì)每個(gè)配置類,基于 @Conditional 注解進(jìn)行條件判斷,排除不滿足條件的類。

3.配置類實(shí)例化與 Bean 注冊(cè)

滿足條件的配置類會(huì)被實(shí)例化,其中的 @Bean 方法會(huì)向容器注冊(cè)組件。

例如,DataSourceAutoConfiguration 會(huì)在滿足條件時(shí)注冊(cè)數(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.用戶配置覆蓋

自動(dòng)配置的 Bean 通常使用 @ConditionalOnMissingBean 注解,允許用戶通過(guò)自定義 Bean 覆蓋默認(rèn)配置。

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

四、自定義自動(dòng)配置

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

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

五、調(diào)試與排查工具

啟用自動(dòng)配置報(bào)告:在 application.properties 中添加:

debug=true

啟動(dòng)日志會(huì)輸出自動(dòng)配置的詳細(xì)報(bào)告,包括哪些配置被應(yīng)用、哪些被排除及原因。

使用 ConditionEvaluationReport:通過(guò) actuator 端點(diǎn) /conditions 查看條件評(píng)估結(jié)果。

總結(jié):自動(dòng)配置的本質(zhì)

Spring Boot 的自動(dòng)配置是 “基于條件的 Bean 注冊(cè)機(jī)制”,通過(guò)以下要素實(shí)現(xiàn):

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

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

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

相關(guān)文章

  • Java無(wú)法輸出中文問(wèn)題及解決

    Java無(wú)法輸出中文問(wèn)題及解決

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

    java獲取http請(qǐng)求的Header和Body的簡(jiǎn)單方法

    下面小編就為大家?guī)?lái)一篇java獲取http請(qǐng)求的Header和Body的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • Java通過(guò)Socket實(shí)現(xiàn)簡(jiǎn)單多人聊天室

    Java通過(guò)Socket實(shí)現(xiàn)簡(jiǎn)單多人聊天室

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

    springboot系統(tǒng)首頁(yè)自動(dòng)跳轉(zhuǎn)拼接到index的實(shí)現(xiàn)

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

    java實(shí)現(xiàn)省市區(qū)三級(jí)聯(lián)動(dòng)

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

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

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

    java.lang.OutOfMemoryError 錯(cuò)誤整理及解決辦法

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

    SpringBoot項(xiàng)目統(tǒng)一枚舉轉(zhuǎn)換實(shí)踐過(guò)程

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

    Java線程取消的三種方式

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

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

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

最新評(píng)論

福鼎市| 莱西市| 义马市| 资中县| 阳东县| 南涧| 东海县| 横山县| 靖安县| 昂仁县| 于都县| 玛多县| 通山县| 壤塘县| 靖西县| 镇巴县| 伊通| 抚松县| 扬州市| 平陆县| 高阳县| 通州区| 彭阳县| 拉孜县| 丰宁| 清水河县| 平和县| 建瓯市| 芒康县| 西青区| 措勤县| 遂川县| 赤城县| 张家界市| 巴彦县| 宾川县| 右玉县| 武隆县| 沙洋县| 左贡县| 多伦县|