SpringBoot06-@ConfigurationProperties注解

?@ConfigurationProperties注解

用于將配置文件(application.properties 或 application.yml)中的配置值,自動綁定到 Java Bean 對象


1-1、基本用途

比如我們在 application.yml 中有這樣一段配置:

app:name: myAppversion: 1.0.0author: wangsi

我們可以創建一個 Java 配置類來接收它:

@Data
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {private String name;private String version;private String author;
}

【注意】:

1、屬性名要和配置的key一致!?

2、prefix=“上一層的key”

然后在其他地方就可以注入這個配置類:

@Autowired
private AppProperties appProperties;

1-2、注解說明

注解作用
@ConfigurationProperties將配置文件中的屬性綁定到 Bean
@Component把這個類注入到 Spring 容器中(或在其他配置類中用 @EnableConfigurationProperties 激活)

1-3、常見用法示例(list集合)

application.yml 配置:

student:name: Lilyage: 22hobbies:- reading- coding

Java 配置類綁定:

@Data
@Component
@ConfigurationProperties(prefix = "student")
public class StudentProperties {private String name;private int age;private List<String> hobbies;
}

1-4、復雜結構綁定(嵌套對象)

server:config:ip: 127.0.0.1port: 8080
@ConfigurationProperties(prefix = "server")
@Component
public class ServerProperties {private Config config;public static class Config {private String ip;private int port;// getters and setters}// getters and setters
}

1-5、與 @Value 對比

特點@Value@ConfigurationProperties
使用方式單個字段注入批量綁定到 Bean
支持類型基本類型支持復雜對象、集合、嵌套結構
可維護性
推薦場景簡單常量配置多個配置綁定、模塊化配置

@ConfigurationProperties 不僅可以為自己定義的配置類綁定屬性值,還可以為第三方 Bean 注入配置!?

1-6、給第三方類注入配置

假設你要使用一個第三方提供的類 com.alibaba.druid.pool.DruidDataSource,它不是你自己寫的,無法直接加 @Component

那怎么把 application.properties 中的配置注入進去呢?

application.yml

在配置類(@Configuration)中注冊bean


1、自動注入原理

Spring Boot 在執行 @Bean 方法時,會通過 @ConfigurationProperties 讀取 yml 中以指定 prefix 開頭的屬性,然后自動調用 setter 方法賦值,即:

druidDataSource.setDriverClassName(...);
druidDataSource.setUrl(...);

2、注意事項

  • DruidDataSource 類必須有 公開的 setter 方法(它有,所以可以綁定)

  • 如果是自己寫的類@ConfigurationProperties@Component?;

  • 如果是第三方類(不能加 @Component),那就需要用 @Bean + @ConfigurationProperties 來注入配置。


3、額外建議

你也可以把配置提取成一個專門的配置類:

@ConfigurationProperties(prefix = "spring.datasource.druid")
public class DruidConfigProperties {private String driverClassName;private String url;private String username;private String password;// getter/setter
}

然后用:

@Bean
public DruidDataSource dataSource(DruidConfigProperties props) {DruidDataSource ds = new DruidDataSource();ds.setDriverClassName(props.getDriverClassName());ds.setUrl(props.getUrl());...return ds;
}

1-7、@EnableConfigurationProperties

@EnableConfigurationProperties 是 Spring Boot 提供的一個注解,用來啟用使用 @ConfigurationProperties 注解的配置類。它常用于你沒有在配置類上加 @Component,但又希望它能被 Spring 管理并注入屬性值的場景。


一句話理解:

@EnableConfigurationProperties(SomeConfig.class) 就是讓 SomeConfig 這個沒有加 @Component 的類,也能用 @ConfigurationProperties 自動注入配置。


舉個例子

配置類,沒有加 @Component

@ConfigurationProperties(prefix = "my.server")
public class ServerProperties {private String name;private Integer port;// getter & setter ...
}

啟用它的方式(在配置類中加上):

@Configuration
@EnableConfigurationProperties(ServerProperties.class)
public class AppConfig {
}

配置文件中:

my:server:name: helloport: 8080

1、那和 @Component 有什么區別?

場景推薦做法
配置類是你自己寫的,可以加注解推薦直接用 @Component + @ConfigurationProperties,簡單
配置類是三方 jar 里的類,不能加注解@EnableConfigurationProperties(SomeClass.class) 來啟用
有多個配置類,集中統一注冊@EnableConfigurationProperties({A.class, B.class}) 一次性啟用多個

2、Spring Boot 推薦方式(官方推薦)

Spring Boot 官方推薦不要在配置類上加 @Component,而是統一用 @EnableConfigurationProperties 管理配置類,這樣職責更清晰(配置類只負責接收配置,不負責成為組件)。

@ConfigurationProperties(prefix = "my.server")
public class ServerProperties {private String name;private Integer port;
}
@Configuration
@EnableConfigurationProperties(ServerProperties.class)
public class AppConfig {
}

3、總結重點

注解作用
@ConfigurationProperties從配置文件注入屬性到 Java Bean
@Component把類注冊到 Spring 容器(必要才能被注入)
@EnableConfigurationProperties顯式注冊沒有 @Component 的配置類,讓其能注入配置

1-8、寬松綁定

【注意】:

1、@Value不支持寬松綁定!

2、綁定的前綴命名規范:純小寫字母、數字、下劃線(@ConfigurationProperties(presfix="前綴"))

1-9、常用計量單位應用

在 Spring Boot 中,從 2.x 版本開始,配置文件(application.propertiesapplication.yml)中支持使用 JDK 8 提供的時間與數據大小的單位,這使得我們能更直觀和簡潔地設置各種參數。


1、時間單位(Duration)

Spring Boot 自動支持 Java 8 中的 Duration格式。

常見時間單位

單位示例(YAML)示例(Properties)
納秒10nstimeout=10ns
微秒10us10μstimeout=10us
毫秒10mstimeout=10ms
10stimeout=10s
分鐘10mtimeout=10m
小時10htimeout=10h
10dtimeout=10d
【示例一】:直接在application配置文件中寫上單位

輸出結果:

ServerConfig(name=lala, portname=8989, timeoutla=PT0.02S, maxUploadSizela=10485760B)

【示例二】:使用對應的添加單位的注解?

返回結果:

ServerConfig(name=lala, portname=8989, timeoutla=PT480H, maxUploadSizela=10240B)

【注意】:

application中的key可以隨意寫,但是,屬性類型要是Duration和DataSize!


2、數據大小單位(DataSize)

Spring Boot 支持 DataSize 類來處理數據大小配置。

常見單位

單位示例(YAML)示例(Properties)
字節10Bmax-size=10B
KB10KBmax-size=10KB
MB10MBmax-size=10MB
GB10GBmax-size=10GB
TB10TBmax-size=10TB

3、底層機制說明

Spring Boot 的 @ConfigurationProperties 支持將配置屬性直接綁定為 DurationDataSize 類型,例如:

@ConfigurationProperties(prefix = "custom")
public class CustomProperties {private Duration timeout;private DataSize maxUploadSize;// getter / setter
}

對應配置:

custom:timeout: 30smax-upload-size: 20MB

注解方式是否支持單位轉換
@ConfigurationProperties? 支持
@Value? 不支持

? 注意:@Value 不支持單位轉換

如果你用 @Value("${xxx}") 注入,單位不會自動轉換:

1-10、開啟bean的數據校驗(JSR-303規范

1、添加依賴

2、開啟bean的校驗功能@Validated

3、在要校驗的屬性上添加具體的校驗規則

常用校驗注解

注解說明
@NotNull不能為 null
@NotEmpty字符串/集合不能為 null 或空
@NotBlank字符串不能為 null 或全空格
@Min/@Max數值范圍限制
@Size長度/集合大小范圍
@Email合法郵箱格式
@Pattern正則表達式
@Positive正數
@AssertTrue必須為 true

1-11、application配置文件的常見問題:八進制

application.yml 文件中,如果你寫了一個 前導為 0 的整數(如 0127)且沒有加引號Spring Boot(底層是 YAML 解析器 SnakeYAML)會將它視為八進制數


舉個例子

port: 0127
  • 這是一個前導 0 的數字。

  • YAML 規范中,這種寫法會被解釋為 八進制

  • 0127 被解釋為八進制的 127,即 十進制的 87

你可以在代碼中打印一下看看:

@Value("${port}")
private int port;// 打印出來是 87,而不是 127

1、如何避免這種問題?

給值加引號,讓它變成字符串

port: "0127"

或者:

port: '0127'

YAML 中,加了引號的內容就不會被當成數字解釋,而是當成字符串處理


2、總結

寫法解釋方式實際數值
0127八進制(0開頭:0-7的數字)87
'0127'字符串"0127"
"0127"字符串"0127"

所以如果你是想表示 字符串 "0127" 或者整數 127,就要特別注意加引號或避免前導 0。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/90265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/90265.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/90265.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle里面concat函數用法,oracle wm_concat函數用法-

wmsys.wm_concat函數&#xff0c;它的作用是以’,’鏈接字符 例子如下&#xff1a; SQL> create table idtable (id number,name varchar2(30)); Table created SQL> insert into idtable values(10,’ab’); 1 row inserted SQL> insert into idtable values(10,’bc…

C++中的list(2)簡單復現list中的關鍵邏輯

C中的list&#xff08;2&#xff09;//簡單復現list中的關鍵邏輯 前言 這一節的主要內容就是&#xff1a;簡單復現list中的關鍵邏輯。同樣的&#xff0c;我們這一節也是先粗略的看一眼源碼&#xff0c;結合源碼&#xff0c;邊理解邊復現。源碼我已經上傳到gitee&#xff0c;網…

Linux——System V 共享內存 IPC

文章目錄一、共享內存的原理二、信道的建立1.創建共享內存1.key的作用2.key的選取3.shmid的作用4.key和shmid的區別5.內存設定的特性6.shmflg的設定2.綁定共享內存3.代碼示例三、利用共享內存通信1.通信2.解除綁定3.銷毀共享內存1.命令行銷毀2.程序中銷毀四、共享內存的生命周期…

Python 程序設計講義(9):Python 的基本數據類型——復數

Python 程序設計講義&#xff08;9&#xff09;&#xff1a;Python 的基本數據類型——復數 復數與數學中的復數概念類似。在 Python 中&#xff0c;復數表示為 abj&#xff0c;其中&#xff1a;a為實數部分&#xff0c;b為虛數部分&#xff0c;j稱為虛數單位。復數必須包含虛數…

leetcode_121 買賣股票的最佳時期

1. 題意 有一個股價變化圖&#xff0c;你可以在一天買入&#xff0c;在未來一天賣出。 求通過這樣一次操作的最大獲利。 2. 題解 2.1 枚舉 直接枚舉&#xff0c;買入賣出的時間&#xff0c;肯定會超時啦~ 時間復雜度為O(n2)O(n^2)O(n2) 空間復雜度為O(1)O(1)O(1) class …

ToBToC的定義與區別

B 端和 C 端主要是從產品所面向的用戶群體角度來區分的&#xff0c;B 端指的是企業用戶&#xff08;Business&#xff09;&#xff0c;C 端指的是個人消費者&#xff08;Consumer&#xff09;&#xff0c;它們在多個方面存在明顯區別&#xff0c;具體如下&#xff1a;用戶特征B…

Python 程序設計講義(8):Python 的基本數據類型——浮點數

Python 程序設計講義&#xff08;8&#xff09;&#xff1a;Python 的基本數據類型——浮點數 目錄Python 程序設計講義&#xff08;8&#xff09;&#xff1a;Python 的基本數據類型——浮點數一、浮點數的表示形式1、小數形式2、指數形式二、浮點數的精確度浮點數也稱小數&am…

MCP客戶端架構與實施

前言:從模型到生產力 — MCP的戰略價值 在過去的一年里,我們團隊見證了大型語言模型(LLM)從技術奇跡向企業核心生產力工具的演變。然而,一個孤立的LLM無法解決實際的業務問題。真正的價值釋放,源于將模型的認知能力與企業現有的數據、API及工作流進行無縫、安全、可擴展…

白盒測試核心覆蓋率標準詳解文檔

白盒測試核心覆蓋率標準詳解文檔 1. 什么是白盒測試與覆蓋率&#xff1f; 白盒測試&#xff08;White-box Testing&#xff09;&#xff0c;又稱結構測試或邏輯驅動測試&#xff0c;是一種測試方法&#xff0c;測試人員能夠訪問并了解被測軟件的內部結構、代碼和實現邏輯。測試…

順豐面試提到的一個算法題

順豐面試提到的一個算法題面試過程中大腦空白&#xff0c;睡了一覺后突然想明白了 原理非常簡單就是根據數組中元素的值對值對應的索引進行排序 哎&#xff0c;&#xff0c;&#xff0c;&#xff0c;具體看以下代碼吧[使用 Java 17 中 Stream 實現] 最好別用 CSDN 提供的在線運…

ChatGPT Agent深度解析:告別單純問答,一個指令搞定復雜任務?

名人說&#xff1a;博觀而約取&#xff0c;厚積而薄發。——蘇軾《稼說送張琥》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄一、什么是ChatGPT Agent&#xff1f;從"客服"到"秘書"的華麗轉…

位運算在算法競賽中的應用(基于C++語言)_位運算優化

在C算法競賽中&#xff0c;位運算優化是一種非常重要的技巧&#xff0c;因為它可以顯著提高算法的效率。以下是一些常見的位運算優化方法及其在各種算法中的應用示例&#xff1a; 常見的位運算優化 1&#xff09;位與運算 &&#xff1a; 用途&#xff1a;用于檢查某個位是否…

SpringBoot 使用Rabbitmq

1.Springboot默認MQ支持rabbitmq或者kafka maven引入依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>propertis添加配置 # spring.rabbitmq.host192.168…

C++核心編程學習4--類和對象--封裝

C面向對象有三大特性&#xff1a;封裝、繼承和多態。 封裝 將屬性和行為作為一個整體。將屬性和行為加以權限控制。 例子1&#xff1a;設計一個圓類 #include <iostream> using namespace std;// 設計一個圓類&#xff0c;求圓的周長 // 圓周率&#xff1a;3.14 const do…

AC身份認證實驗之AAA服務器

一、實驗背景某公司需要在企業的公司網絡出口使用上網行為管理設備&#xff0c;以審計管理局域網的所有設備&#xff0c;同時&#xff0c;局域網內的所有設備都將上網行為代理上網&#xff0c;但是發生過訪客外傳一些非法信息&#xff0c;所以需要對外來人員進行實名認證&#…

數組算法之【數組中第K個最大元素】

目錄 LeetCode-215題 LeetCode-215題 給定整數數組nums和整數k&#xff0c;返回數組中第k個最大元素 public class Solution {/*** 這里是基于小頂堆這種數據結構來實現的*/public int findKthLargest(int[] nums, int k) {// 實例化一個小頂堆MinHeap minHeap new MinHeap…

高亮匹配關鍵詞樣式highLightMatchString、replaceHTMLChar

replaceHTMLChar: s > s.toString().replace(/</g, <).replace(/>/g, >),// 高亮匹配關鍵詞樣式----------------------------------------highLightMatchString(originStr, matchStr, customClass ) {matchStr && (matchStr matchStr.replace(/[.*?…

HUAWEI Pura80系列機型參數對比

類別HUAWEI Pura80 UltraHUAWEI Pura80 ProHUAWEI Pura80 ProHUAWEI Pura80建議零售價&#xffe5;9999起&#xffe5;7999起&#xffe5;6499起&#xffe5;4699起顏色鎏光金、鎏光黑釉紅、釉青、釉白、釉黑釉金、釉白、釉黑絲絨金、絲絨綠、絲絨白、絲絨黑外觀材質設計光芒耀…

使用 PyTorch 的 torchvision 庫加載 CIFAR-10 數據集

CIFAR-10是一個更接近普適物體的彩色圖像數據集。CIFAR-10 是由Hinton 的學生Alex Krizhevsky 和Ilya Sutskever 整理的一個用于識別普適物體的小型數據集。一共包含10 個類別的RGB 彩色圖片&#xff1a;飛機&#xff08; airplane &#xff09;、汽車&#xff08; automobile …

藍橋杯51單片機

這是我備考省賽的時候總結的錯誤點和創新點那個時候是用來提醒自己的&#xff0c;現在分享給你們看^_^一考點二注意點記得初始化&#xff39;&#xff14;&#xff0c;&#xff39;&#xff15;&#xff0c;&#xff39;&#xff16;&#xff0c;&#xff39;&#xff17;&…