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

SpringBoot實現(xiàn)自動配置的方式詳解

 更新時間:2025年04月08日 09:29:46   作者:雷淵  
Spring Boot 自動配置 是其核心特性之一,它通過智能化的默認(rèn)配置減少了開發(fā)者的工作量,自動配置的原理基于條件化配置和 Spring 的 @Configuration 機(jī)制,本文給大家講解了SpringBoot實現(xiàn)自動配置的過程,需要的朋友可以參考下

Spring Boot 的自動配置是其「約定優(yōu)于配置」理念的核心實現(xiàn),通過智能推斷和條件化加載機(jī)制,大幅簡化了 Spring 應(yīng)用的配置過程。以下是其實現(xiàn)原理的詳細(xì)分析:

1. 自動配置觸發(fā)機(jī)制

1.1 核心注解 @EnableAutoConfiguration

  • 作用:啟用自動配置流程,觸發(fā)自動配置類的加載。
  • 實現(xiàn)原理
    通過 @Import(AutoConfigurationImportSelector.class) 導(dǎo)入選擇器類,該類負(fù)責(zé)掃描并加載所有符合條件的自動配置類。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { /* ... */ })
public @interface SpringBootApplication {
    // 組合了 @Configuration、@EnableAutoConfiguration、@ComponentScan
}

1.2 自動配置類加載流程

  • 啟動階段SpringApplication.run() 初始化時,觸發(fā)自動配置。
  • 加載 spring.factories:掃描所有依賴的 META-INF/spring.factories 文件,獲取 org.springframework.boot.autoconfigure.EnableAutoConfiguration 鍵值對應(yīng)的配置類列表。
  • 過濾與排序
    • 排除 exclude 指定的類(通過 @SpringBootApplication(exclude={DataSourceAutoConfiguration.class}))。
    • @AutoConfigureOrder@AutoConfigureBefore、@AutoConfigureAfter 調(diào)整加載順序。

2. 條件化配置機(jī)制

Spring Boot 通過 條件注解 實現(xiàn)智能配置,核心注解包括:

條件注解作用典型應(yīng)用場景
@ConditionalOnClass類路徑存在指定類時生效自動配置 Tomcat/Jetty 嵌入式容器
@ConditionalOnMissingBean容器中不存在指定 Bean 時生效避免覆蓋用戶自定義 Bean
@ConditionalOnProperty配置文件中存在指定屬性且匹配值時生效多環(huán)境配置切換
@ConditionalOnWebApplication當(dāng)前應(yīng)用是 Web 應(yīng)用時生效僅 Web 環(huán)境下啟用 MVC 配置

2.1 條件注解的實現(xiàn)原理

  • 底層接口Condition 接口,通過 matches() 方法返回條件是否滿足。
  • 處理流程
    ConfigurationClassParser 在解析配置類時,通過 ConditionEvaluator 評估所有條件注解。

示例:DataSourceAutoConfiguration

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {
    // 當(dāng)類路徑存在 DataSource 且未配置 R2DBC 時生效
}

3. 自動配置類結(jié)構(gòu)

3.1 典型自動配置類組成

  • @Configuration:聲明為配置類。
  • 條件注解:控制配置類的生效條件。
  • @EnableConfigurationProperties:綁定外部化配置(如 application.yml)。
  • Bean 定義方法:使用 @Bean 注冊組件,通常結(jié)合條件注解。

示例:HttpEncodingAutoConfiguration

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ServerProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "server.servlet.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {

    private final Encoding properties;

    public HttpEncodingAutoConfiguration(ServerProperties properties) {
        this.properties = properties.getServlet().getEncoding();
    }

    @Bean
    @ConditionalOnMissingBean
    public CharacterEncodingFilter characterEncodingFilter() {
        // 基于配置創(chuàng)建過濾器
        CharacterEncodingFilter filter = new CharacterEncodingFilter();
        filter.setEncoding(this.properties.getCharset().name());
        filter.setForceRequestEncoding(this.properties.shouldForce(Encoding.Type.REQUEST));
        filter.setForceResponseEncoding(this.properties.shouldForce(Encoding.Type.RESPONSE));
        return filter;
    }
}

4. 外部化配置與屬性綁定

4.1 @EnableConfigurationProperties

  • 作用:將 application.properties/application.yml 中的屬性綁定到 Java 對象。
  • 實現(xiàn):通過 ConfigurationPropertiesBindingPostProcessor 后置處理器處理屬性綁定。

示例:ServerProperties

server:
  port: 8080
  servlet:
    encoding:
      charset: UTF-8
      enabled: true
@ConfigurationProperties(prefix = "server")
public class ServerProperties {
    private Integer port;
    private Servlet servlet;
    
    public static class Servlet {
        private final Encoding encoding = new Encoding();
        // getters/setters
    }
}

4.2 屬性覆蓋規(guī)則

  • 優(yōu)先級順序
    命令行參數(shù) > Java 系統(tǒng)屬性 > OS 環(huán)境變量 > 應(yīng)用配置文件(application-{profile}.yml)> 默認(rèn)配置。

5. 自動配置的調(diào)試與優(yōu)化

5.1 調(diào)試自動配置

  • 啟用調(diào)試日志:在 application.properties 中添加:

debug=true
  • 啟動時將打印 條件評估報告,顯示哪些自動配置類被啟用/排除。

  • 查看報告內(nèi)容

============================
CONDITION EVALUATION REPORT
============================
Positive matches:
-----------------
   DataSourceAutoConfiguration matched:
      - @ConditionalOnClass found required classes 'javax.sql.DataSource', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' (OnClassCondition)

Negative matches:
-----------------
   ActiveMQAutoConfiguration:
      Did not match:
         - @ConditionalOnClass did not find required class 'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)

5.2 排除不必要的自動配置

  • 方式 1:注解排除
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
  • 方式 2:配置文件排除
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

6. 自定義自動配置

6.1 創(chuàng)建自定義 Starter

  • 定義自動配置類
@Configuration
@ConditionalOnClass(MyService.class)
@EnableConfigurationProperties(MyServiceProperties.class)
public class MyServiceAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public MyService myService(MyServiceProperties properties) {
        return new MyService(properties.getEndpoint());
    }
}
  • 聲明配置類
    在 src/main/resources/META-INF/spring.factories 中添加:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.MyServiceAutoConfiguration
  • 打包發(fā)布
    將項目打包為 Starter(通常命名為 xxx-spring-boot-starter),供其他項目依賴。

6.2 條件注解的擴(kuò)展

  • 自定義條件:實現(xiàn) Condition 接口,結(jié)合 @Conditional 使用。
public class OnProductionEnvironmentCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return "prod".equals(context.getEnvironment().getProperty("app.env"));
    }
}

@Configuration
@Conditional(OnProductionEnvironmentCondition.class)
public class ProductionConfig {
    // 生產(chǎn)環(huán)境專用配置
}

總結(jié):Spring Boot 自動配置的核心機(jī)制

機(jī)制實現(xiàn)方式
觸發(fā)入口@EnableAutoConfiguration 導(dǎo)入 AutoConfigurationImportSelector
配置類發(fā)現(xiàn)掃描所有 META-INF/spring.factories 中注冊的自動配置類
條件化加載通過 @ConditionalOnClass@ConditionalOnMissingBean 等注解動態(tài)判斷
屬性綁定@ConfigurationProperties 結(jié)合 Environment 屬性源
自定義擴(kuò)展創(chuàng)建 Starter 并注冊自動配置類,結(jié)合條件注解控制生效場景

以上就是SpringBoot實現(xiàn)自動配置的方式詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot自動配置的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用logback日志文件多環(huán)境配置路徑方式

    使用logback日志文件多環(huán)境配置路徑方式

    文章介紹了兩種解決Spring Boot項目中日志文件多環(huán)境配置路徑問題的方法,第一種方法是通過啟動jar包時添加參數(shù)指定日志配置文件;第二種方法是通過配置logback-spring.xml文件根據(jù)不同的環(huán)境加載不同的日志路徑
    2025-02-02
  • 使用遞歸刪除樹形結(jié)構(gòu)的所有子節(jié)點(java和mysql實現(xiàn))

    使用遞歸刪除樹形結(jié)構(gòu)的所有子節(jié)點(java和mysql實現(xiàn))

    下面小編就為大家?guī)硪黄褂眠f歸刪除樹形結(jié)構(gòu)的所有子節(jié)點(java和mysql實現(xiàn))。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • idea導(dǎo)入工程時不能導(dǎo)入maven項目不能加入tomcatServer的原因

    idea導(dǎo)入工程時不能導(dǎo)入maven項目不能加入tomcatServer的原因

    這篇文章主要介紹了idea導(dǎo)入工程時不能導(dǎo)入maven項目不能加入tomcatServer的原因及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • Spring Cloud zuul自定義統(tǒng)一異常處理實現(xiàn)方法

    Spring Cloud zuul自定義統(tǒng)一異常處理實現(xiàn)方法

    這篇文章主要介紹了Spring Cloud zuul自定義統(tǒng)一異常處理實現(xiàn),需要的朋友可以參考下
    2018-02-02
  • java在運行時能修改工作目錄嗎

    java在運行時能修改工作目錄嗎

    這篇文章主要給大家介紹了關(guān)于java在運行時能修改工作目錄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • maven如何利用springboot的配置文件進(jìn)行多個環(huán)境的打包

    maven如何利用springboot的配置文件進(jìn)行多個環(huán)境的打包

    這篇文章主要介紹了maven如何利用springboot的配置文件進(jìn)行多個環(huán)境的打包,在Spring Boot中多環(huán)境配置文件名需要滿足application-{profiles.active}.properties的格式,其中{profiles.active}對應(yīng)你的環(huán)境標(biāo)識,本文給大家詳細(xì)講解,需要的朋友可以參考下
    2023-02-02
  • 淺談Hibernate對象狀態(tài)之間的神奇轉(zhuǎn)換

    淺談Hibernate對象狀態(tài)之間的神奇轉(zhuǎn)換

    這篇文章主要介紹了淺談Hibernate對象狀態(tài)之間的神奇轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • Lombok之@AllArgsConstructor的使用方式

    Lombok之@AllArgsConstructor的使用方式

    這篇文章主要介紹了Lombok之@AllArgsConstructor的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • SpringBoot整合FastJson過程解析

    SpringBoot整合FastJson過程解析

    這篇文章主要介紹了SpringBoot整合FastJson過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • IDEA上面搭建一個SpringBoot的web-mvc項目遇到的問題

    IDEA上面搭建一個SpringBoot的web-mvc項目遇到的問題

    這篇文章主要介紹了IDEA上面搭建一個SpringBoot的web-mvc項目遇到的問題小結(jié),需要的朋友可以參考下
    2017-04-04

最新評論

临沧市| 营口市| 临汾市| 邵阳县| 牙克石市| 镶黄旗| 连州市| 邓州市| 井冈山市| 丁青县| 五台县| 大石桥市| 彭阳县| 修水县| 麟游县| 玉田县| 建阳市| 丹寨县| 长宁区| 金平| 寻乌县| 开远市| 汽车| 合江县| 军事| 甘德县| 株洲市| 阿拉善左旗| 皮山县| 阳谷县| 元阳县| 阿克苏市| 龙海市| 伊金霍洛旗| 黄大仙区| 溆浦县| 谢通门县| 磐安县| 康乐县| 抚远县| 偃师市|