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

SpringBoot實(shí)現(xiàn)自動(dòng)配置的方式詳解

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

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

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

1.1 核心注解 @EnableAutoConfiguration

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

1.2 自動(dòng)配置類加載流程

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

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

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

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

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

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

示例: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 時(shí)生效
}

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

3.1 典型自動(dòng)配置類組成

  • @Configuration:聲明為配置類。
  • 條件注解:控制配置類的生效條件。
  • @EnableConfigurationProperties:綁定外部化配置(如 application.yml)。
  • Bean 定義方法:使用 @Bean 注冊(cè)組件,通常結(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 對(duì)象。
  • 實(shí)現(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)先級(jí)順序
    命令行參數(shù) > Java 系統(tǒng)屬性 > OS 環(huán)境變量 > 應(yīng)用配置文件(application-{profile}.yml)> 默認(rèn)配置。

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

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

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

debug=true
  • 啟動(dòng)時(shí)將打印 條件評(píng)估報(bào)告,顯示哪些自動(dòng)配置類被啟用/排除。

  • 查看報(bào)告內(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 排除不必要的自動(dòng)配置

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

6. 自定義自動(dòng)配置

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

  • 定義自動(dòng)配置類
@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ā)布
    將項(xiàng)目打包為 Starter(通常命名為 xxx-spring-boot-starter),供其他項(xiàng)目依賴。

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

  • 自定義條件:實(shí)現(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 自動(dòng)配置的核心機(jī)制

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

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

相關(guān)文章

  • java+selenium爬取圖片簽名的方法

    java+selenium爬取圖片簽名的方法

    這篇文章主要為大家詳細(xì)介紹了java+selenium爬取圖片簽名的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java實(shí)現(xiàn)文字滾動(dòng)廣告字幕效果

    Java實(shí)現(xiàn)文字滾動(dòng)廣告字幕效果

    文字滾動(dòng)廣告字幕是一種常見的動(dòng)態(tài)文本展示效果,通常用于展示新聞、廣告或其他動(dòng)態(tài)信息,在本項(xiàng)目中,我們將使用Java的Swing庫來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的文字滾動(dòng)廣告字幕效果,通過定時(shí)更新文本的位置來模擬文字的滾動(dòng),需要的朋友可以參考下
    2025-02-02
  • Java線程創(chuàng)建的四種方式總結(jié)

    Java線程創(chuàng)建的四種方式總結(jié)

    這篇文章主要介紹了Java線程創(chuàng)建的四種方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • 淺談Java并發(fā)編程之Lock鎖和條件變量

    淺談Java并發(fā)編程之Lock鎖和條件變量

    這篇文章主要介紹了淺談Java并發(fā)編程之Lock鎖和條件變量,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • javac -encoding 用法詳解

    javac -encoding 用法詳解

    當(dāng)我們編輯了一個(gè)Java源文件保存時(shí),是以操作系統(tǒng)默認(rèn)的字符編碼保存的(Windows xp默認(rèn)字符集是GBK)。這篇文章主要介紹了javac -encoding 用法詳解,非常具有實(shí)用價(jià)值。
    2016-12-12
  • Java生成指定范圍內(nèi)的一個(gè)隨機(jī)整數(shù)2種方式

    Java生成指定范圍內(nèi)的一個(gè)隨機(jī)整數(shù)2種方式

    本文主要介紹了Java生成指定范圍內(nèi)的一個(gè)隨機(jī)整數(shù)2種方式,主要使用Math.random()和Random.nextInt()這兩種,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-04-04
  • Spring Boot整合RabbitMQ開發(fā)實(shí)戰(zhàn)詳解

    Spring Boot整合RabbitMQ開發(fā)實(shí)戰(zhàn)詳解

    這篇文章主要介紹了Spring Boot整合RabbitMQ開發(fā)實(shí)戰(zhàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-02-02
  • Java中的CAS鎖機(jī)制(無鎖、自旋鎖、樂觀鎖、輕量級(jí)鎖)詳解

    Java中的CAS鎖機(jī)制(無鎖、自旋鎖、樂觀鎖、輕量級(jí)鎖)詳解

    這篇文章主要介紹了Java中的CAS鎖機(jī)制(無鎖、自旋鎖、樂觀鎖、輕量級(jí)鎖)詳解,CAS算法的作用是解決多線程條件下使用鎖造成性能損耗問題的算法,保證了原子性,這個(gè)原子操作是由CPU來完成的,需要的朋友可以參考下
    2024-01-01
  • JDK 14的新特性:文本塊Text Blocks的使用

    JDK 14的新特性:文本塊Text Blocks的使用

    這篇文章主要介紹了JDK 14的新特性:文本塊Text Blocks的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • 在SpringBoot中,如何使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用方法總結(jié)

    在SpringBoot中,如何使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用方法總結(jié)

    我們?cè)谶M(jìn)行網(wǎng)絡(luò)連接的時(shí)候,建立套接字連接是一個(gè)非常消耗性能的事情,特別是在分布式的情況下,用線程池去保持多個(gè)客戶端連接,是一種非常消耗線程的行為.那么我們?cè)撏ㄟ^什么技術(shù)去解決上述的問題呢,那么就不得不提一個(gè)網(wǎng)絡(luò)連接的利器——Netty,需要的朋友可以參考下
    2021-06-06

最新評(píng)論