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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;&…