欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

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

@SpringBootApplication 注解包含了 @EnableAutoConfiguration,它通過 @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)的配置類列表。
  • 過濾配置類:基于 @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)配置類通過條件注解實(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)配置類通過 @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.加載并過濾配置類

  • 讀取 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 注解,允許用戶通過自定義 Bean 覆蓋默認(rèn)配置。

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

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

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

  • 創(chuàng)建配置類:使用 @Configuration@Conditional 注解定義配置邏輯。
  • 綁定配置屬性:通過 @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:通過 actuator 端點(diǎn) /conditions 查看條件評(píng)估結(jié)果。

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

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

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

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

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

相關(guān)文章

  • 詳解如何使用SpringBoot實(shí)現(xiàn)下載JSON文件

    詳解如何使用SpringBoot實(shí)現(xiàn)下載JSON文件

    在?Spring?Boot?中實(shí)現(xiàn)文件下載功能,可以通過將?JSON?字符串作為文件內(nèi)容返回給客戶端從而實(shí)現(xiàn)JSON文件下載效果,下面我們就來看看具體操作吧
    2025-02-02
  • SpringBoot項(xiàng)目整合mybatis的方法步驟與實(shí)例

    SpringBoot項(xiàng)目整合mybatis的方法步驟與實(shí)例

    今天小編就為大家分享一篇關(guān)于SpringBoot項(xiàng)目整合mybatis的方法步驟與實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Spring注解方式防止重復(fù)提交原理詳解

    Spring注解方式防止重復(fù)提交原理詳解

    這篇文章主要為大家詳細(xì)介紹了Spring注解方式防止重復(fù)提交原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Java單例模式實(shí)例簡述

    Java單例模式實(shí)例簡述

    這篇文章主要介紹了Java單例模式,在Java應(yīng)用程序設(shè)計(jì)中有著非常重要的作用,本文以實(shí)例形式對(duì)此加以簡單分析,需要的朋友可以參考下
    2014-09-09
  • Java Socket實(shí)現(xiàn)聊天室附1500行源代碼

    Java Socket實(shí)現(xiàn)聊天室附1500行源代碼

    Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。本篇文章手把手帶你通過Java Socket來實(shí)現(xiàn)自己的聊天室,大家可以在過程中查缺補(bǔ)漏,溫故而知新
    2021-10-10
  • 詳解SpringMVC組件之HandlerMapping(二)

    詳解SpringMVC組件之HandlerMapping(二)

    這篇文章主要介紹了詳解SpringMVC組件之HandlerMapping(二),HandlerMapping組件是Spring?MVC核心組件,用來根據(jù)請(qǐng)求的request查找對(duì)應(yīng)的Handler,在Spring?MVC中,有各式各樣的Web請(qǐng)求,每個(gè)請(qǐng)求都需要一個(gè)對(duì)應(yīng)的Handler來處理,需要的朋友可以參考下
    2023-08-08
  • Java?Stream常用方法合集(超詳細(xì))

    Java?Stream常用方法合集(超詳細(xì))

    Stream?API?提供了一種更為簡潔高效的的方式來處理集合數(shù)據(jù),??可讀性較高,?所以本文為大家整理了Java?Stream中的常用方法,希望對(duì)大家有所幫助
    2023-07-07
  • SpringBoot獲取Request和Response方法代碼解析

    SpringBoot獲取Request和Response方法代碼解析

    這篇文章主要介紹了SpringBoot獲取Request和Response方法代碼解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • java web開發(fā)之購物車功能實(shí)現(xiàn)示例代碼

    java web開發(fā)之購物車功能實(shí)現(xiàn)示例代碼

    這篇文章主要介紹了java web開發(fā)之購物車功能實(shí)現(xiàn)示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-10-10
  • SpringBoot 返回Json實(shí)體類屬性大小寫的解決

    SpringBoot 返回Json實(shí)體類屬性大小寫的解決

    這篇文章主要介紹了SpringBoot 返回Json實(shí)體類屬性大小寫的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論