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

解讀@ConfigurationProperties和@value的區(qū)別

 更新時(shí)間:2025年05月23日 11:12:17   作者:codingPower  
這篇文章主要介紹了@ConfigurationProperties和@value的區(qū)別及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在 Spring Boot 中,@ConfigurationProperties@Value 都是用于注入配置值的注解,但它們的設(shè)計(jì)目標(biāo)、使用場(chǎng)景和功能有顯著差異。

以下是它們的核心區(qū)別和適用場(chǎng)景:

1. 功能對(duì)比

特性@ConfigurationProperties@Value
作用范圍批量綁定配置文件中的 一組相關(guān)屬性 到 Bean 的字段。注入 單個(gè)屬性值 到字段或參數(shù)。
松散綁定支持松散綁定(如 myProp、my-prop、MY_PROP)。不支持,屬性名必須嚴(yán)格匹配。
類型安全基于 類型安全的配置綁定(字段類型自動(dòng)轉(zhuǎn)換)。需要手動(dòng)處理類型轉(zhuǎn)換,如 @Value("${port}") int port。
SpEL 表達(dá)式不支持 SpEL 表達(dá)式。支持 SpEL 表達(dá)式(如 @Value("#{systemProperties['user']}"))。
默認(rèn)值通過字段初始化設(shè)置默認(rèn)值(如 private String name = "default";)。可在占位符中指定默認(rèn)值(如 @Value("${name:default}"))。
驗(yàn)證支持支持 JSR-303 驗(yàn)證(如 @NotNull、@Size)。不支持 驗(yàn)證注解。
復(fù)雜對(duì)象綁定支持嵌套對(duì)象、集合、Map 等復(fù)雜結(jié)構(gòu)的綁定。僅支持簡(jiǎn)單類型(需手動(dòng)拆分復(fù)雜結(jié)構(gòu))。

2. 使用場(chǎng)景對(duì)比

@ConfigurationProperties

適用場(chǎng)景

  • 需要將 一組相關(guān)的配置屬性 綁定到一個(gè)對(duì)象(如數(shù)據(jù)庫(kù)配置、第三方服務(wù)配置)。
  • 需要類型安全、自動(dòng)轉(zhuǎn)換和松散綁定。
  • 需要支持嵌套對(duì)象或集合類型(如 List、Map)。

示例一

  // 配置類定義
  @Component
  @ConfigurationProperties(prefix = "app.datasource")
  public class DataSourceConfig {
      private String url;
      private String username;
      private int maxPoolSize;
      // Getters and Setters
  }
  
// 業(yè)務(wù)類調(diào)用
@Service
public class DataSourceService {
    @Autowired
    private DataSourceConfig dataConfig; // 直接注入配置對(duì)象

    public void connect() {
        System.out.println("Connecting to: " + dataConfig.getUrl() + ":" + dataConfig.getUsername());
    }
}

對(duì)應(yīng) application.properties

 # application.properties
 app.datasource.url=jdbc:mysql://localhost:3306/db
 app.datasource.username=power
 app.datasource.max-pool-size=10

對(duì)應(yīng) application.yml:

app:
  datasource:
    url: jdbc:mysql://localhost:3306/db
    username: power
   maxPoolSize: 10

示例二

  • 通過 @EnableConfigurationProperties 顯式啟用‌

‌步驟‌:

  • 在配置類或主啟動(dòng)類上使用 @EnableConfigurationProperties 注解,手動(dòng)注冊(cè)配置類14。
  • 通過構(gòu)造函數(shù)或 @Autowired 注入配置對(duì)象。

‌代碼示例‌:

/ 配置類定義(無需 @Component)
@ConfigurationProperties(prefix = "app.mail")
public class MailConfig {
    private String host;
    private int port;
    // getter/setter
}

// 主啟動(dòng)類顯式啟用
@SpringBootApplication
@EnableConfigurationProperties(MailConfig.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

// 業(yè)務(wù)類調(diào)用(構(gòu)造器注入)
@Service
public class MailService {
    private final MailConfig mailConfig;

    public MailService(MailConfig mailConfig) {
        this.mailConfig = mailConfig;
    }
}

@Value

適用場(chǎng)景

  • 注入 單個(gè)簡(jiǎn)單值(如開關(guān)標(biāo)志、端口號(hào))。
  • 需要?jiǎng)討B(tài)計(jì)算值(使用 SpEL 表達(dá)式)。
  • 臨時(shí)調(diào)試或快速原型開發(fā)。

示例

@Component
public class MyService {
    @Value("${app.feature.enabled:false}")
    private boolean featureEnabled;

    @Value("#{systemProperties['user.timezone']}")
    private String timezone;
}

3. 核心區(qū)別詳解

(1) 類型安全與松散綁定

@ConfigurationProperties

  • 自動(dòng)將配置文件中的屬性轉(zhuǎn)換為字段類型(如 Stringint、List)。
  • 支持松散綁定(屬性名不嚴(yán)格匹配),例如 myProp、my-prop、MY_PROP 都會(huì)匹配到字段 myProp。

@Value

  • 需要手動(dòng)處理類型轉(zhuǎn)換(如 @Value("${port}") int port)。
  • 屬性名必須嚴(yán)格匹配,否則注入失敗。

(2) 復(fù)雜對(duì)象支持

@ConfigurationProperties

支持嵌套對(duì)象和集合:

app:
  servers:
    - name: server1
      ip: 192.168.1.1
    - name: server2
      ip: 192.168.1.2
@ConfigurationProperties(prefix = "app")
public class AppConfig {
    private List<Server> servers;
    // Getters and Setters
}

@Value

需要手動(dòng)拆分復(fù)雜結(jié)構(gòu):

@Value("${app.servers[0].name}")
private String server1Name;

(3) 驗(yàn)證與默認(rèn)值

@ConfigurationProperties

結(jié)合 @Validated 實(shí)現(xiàn)字段驗(yàn)證:

@ConfigurationProperties(prefix = "app")
@Validated
public class AppConfig {
    @NotNull
    private String name;
    @Min(1)
    private int maxConnections;
}

@Value

直接在占位符中設(shè)置默認(rèn)值:

@Value("${app.name:DefaultApp}")
private String appName;

4. 如何選擇?

場(chǎng)景推薦注解
需要綁定一組相關(guān)配置@ConfigurationProperties
需要注入單個(gè)簡(jiǎn)單值@Value
需要支持松散綁定或復(fù)雜結(jié)構(gòu)@ConfigurationProperties
需要使用 SpEL 動(dòng)態(tài)計(jì)算值@Value
需要類型安全與 JSR-303 驗(yàn)證@ConfigurationProperties

總結(jié)

@ConfigurationProperties

適合 集中管理復(fù)雜配置,提供類型安全、松散綁定和驗(yàn)證支持,是 Spring Boot 推薦的配置注入方式。

@Value

適合 快速注入簡(jiǎn)單值或動(dòng)態(tài)計(jì)算值,靈活性高但缺乏類型安全和批量綁定能力。

根據(jù)實(shí)際需求選擇合適的注解,優(yōu)先使用 @ConfigurationProperties 以提高代碼的可維護(hù)性和健壯性。

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

相關(guān)文章

  • 利用Java中Calendar計(jì)算兩個(gè)日期之間的天數(shù)和周數(shù)

    利用Java中Calendar計(jì)算兩個(gè)日期之間的天數(shù)和周數(shù)

    Java 語言的Calendar(日歷),Date(日期),和DateFormat(日期格式)組成了Java標(biāo)準(zhǔn)的一個(gè)基本但是非常重要的部分。日期是商業(yè)邏輯計(jì)算一個(gè)關(guān)鍵的部分。下面這篇文章就給大家介紹了如何利用Java中Calendar計(jì)算兩個(gè)日期之間的天數(shù)和周數(shù),下面來一起看看吧。
    2016-12-12
  • Java Robot應(yīng)用示例之機(jī)器人功能

    Java Robot應(yīng)用示例之機(jī)器人功能

    這篇文章主要為大家詳細(xì)介紹了Java Robot應(yīng)用示例之機(jī)器人功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • k8s部署java項(xiàng)目的實(shí)現(xiàn)

    k8s部署java項(xiàng)目的實(shí)現(xiàn)

    本文主要介紹了k8s部署java項(xiàng)目的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理(總結(jié))

    Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理(總結(jié))

    這篇文章主要介紹了Java中實(shí)現(xiàn)多線程關(guān)鍵詞整理,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-05-05
  • Struts2返回json格式數(shù)據(jù)代碼實(shí)例

    Struts2返回json格式數(shù)據(jù)代碼實(shí)例

    這篇文章主要介紹了Struts2返回json格式數(shù)據(jù)代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java在高并發(fā)場(chǎng)景下實(shí)現(xiàn)點(diǎn)贊計(jì)數(shù)器

    Java在高并發(fā)場(chǎng)景下實(shí)現(xiàn)點(diǎn)贊計(jì)數(shù)器

    點(diǎn)贊計(jì)數(shù)器的本質(zhì)就是對(duì)某個(gè)變量在高并發(fā)情況下的修改,這篇文章主要為大家介紹了Java實(shí)現(xiàn)點(diǎn)贊計(jì)數(shù)器的示例代碼,感興趣的小伙伴可以了解一下
    2023-06-06
  • Java Stream流從入門到精通(最新整理)

    Java Stream流從入門到精通(最新整理)

    Java Stream 是一個(gè)來自 java.util.stream 包的抽象概念,它允許你以聲明方式處理數(shù)據(jù)集合(例如 List、Set 等),本文給大家介紹Java Stream流從入門到精通,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • Spring外部化配置的幾種技巧分享

    Spring外部化配置的幾種技巧分享

    在油管上看了龍之春的一個(gè)Spring tips 視頻,講述Spring外部化配置的幾種技巧,收獲頗多,想拿出來給大家分享下。對(duì)spring感興趣的朋友可以了解下本文
    2021-06-06
  • javaWeb 四大域?qū)ο笤敿?xì)介紹

    javaWeb 四大域?qū)ο笤敿?xì)介紹

    這篇文章主要介紹了javaWeb 四大域?qū)ο笤敿?xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • 使用SpringBoot自定義starter的完整步驟

    使用SpringBoot自定義starter的完整步驟

    這篇文章主要給大家介紹了關(guān)于使用SpringBoot自定義starter的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評(píng)論

长治县| 昌宁县| 香河县| 布尔津县| 通城县| 万荣县| 潢川县| 新建县| 清水河县| 洪雅县| 渑池县| 峡江县| 吴江市| 临漳县| 濮阳县| 民和| 德庆县| 舟山市| 桐梓县| 花莲市| 同德县| 永兴县| 宜川县| 卢龙县| 富裕县| 沂南县| 观塘区| 台前县| 万盛区| 吐鲁番市| 靖西县| 辽宁省| 黄平县| 普定县| 丽江市| 定结县| 东方市| 西昌市| 永兴县| 广丰县| 嘉定区|