Spring boot配置绑定和配置属性校验的方式详解
作者:桃花键神 发布时间:2022-04-21 03:06:06
配置绑定
所谓配置绑定”就是把配置文件中的值与 JavaBean 中对应的属性进行绑定。通常,我们会把一些配置信息(例如,数据库配置)放在配置文件中,然后通过 Java 代码去读取该配置文件,并且把配置文件中指定的配置封装到 JavaBean(实体类) 中。
SpringBoot 提供了以下 2 种方式进行配置绑定:
使用 @ConfigurationProperties 注解
使用 @Value 注解
先建立数据配置文件
application.yml
sb:
port: 8086
username: 'abc \n hello' #字符串
password: 6564321 #字符串
birthday: 2011/12/23 #日期
books: #map
jsp: 36
html: 78
spring: 78
books2: {jsp: 56,spring: 65,mybatis: 98} #map 行内
person: #javabean
name: abc
age: 23
person2: {name: lily, age: 36 } #javabean行内
hobby: #数组
- jsp
- hibernate
- spring
- mybatis
list: # list集合
- 32
- 65
- 98
set: #set 集合
- hello
- world
hobby2: [23,45,56] #数组 list set 行内
mapList: # 数组 list set 里存map
- jsp: 36
hibernate: 58
- html: 65
css: 98
js: 65
- {vue: 36,react: 98}
@ConfigurationProperties
通过 Spring Boot 提供的 @ConfigurationProperties 注解,可以将全局配置文件中的配置数据绑定到 JavaBean 中。
DbConfig.java
@Configuration
@ConfigurationProperties(prefix = "sb")
public class DbConfig {
String username;
String password;
Date birthday;
Map books;
Person person;
Map books2;
Person person2;
String [] hobby;
List list;
Set set ;
int [] hobby2;
List<Map> mapList;
/************省略geter/seter方法*************/
}
只有在容器中的组件,才会拥有 SpringBoot 提供的强大功能。如
果我们想要使用 @ConfigurationProperties 注解进行配置绑定,
那么首先就要保证该对 JavaBean 对象在 IoC 容器中,所以需要用
到 @Configuration 注解来添加组件到容器中。
JavaBean 上使用了注解 @ConfigurationProperties(prefix = “sb”)
,它表示将这个 JavaBean 中的所有属性与配置文件中以“sb”为前
缀的配置进行绑定。
@Value
@Value的作用是通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值。 @Value的值有两类:
① ${property : default_value }
② #{ obj.property? :default_value }
第一个注入的是外部配置文件对应的property,第二个则是SpEL表达式对应的内容。
default_value,就是前面的值为空时的默认值。注意二者的不同,#{}里面那个obj代表对象。
也就是说@Value注解有两种用法,一种是@Value(“${}”)和@Value(“#{}”),搞清楚分类后我们一一来分析。
第一种 @Value(“${}”)
controller层代码:
@RestController
@RequestMapping("/test")
public class ValueController {
@Autowired
private CarpollingService carpollingService;
@GetMapping("/getValue")
public String getValue(){
return carpollingService.getValue();
}
}
配置类代码:
@Configuration
public class CarpollingServiceImpl {
@Value("${db.port}")
private String port;
@Override
public String getValue() {
return port;
}
}
第二种@Value(“#{}”)
注意: #{}是不能以第一种方式来进行取值,否则会报错
前面已经说了,#{}里面包含的是obj,所以需要配合bean来使用,现在创建一个UserBean,并且给某个字段加上@Value(“#{}”)注解(按自己的需求任意添加注解)
UserBean类代码:
@Data
@Component//添加component注解,使其注册进容器,交由容器进行管理
public class UserBean {
private String name="张三";}
controller层代码:
@RestController
@RequestMapping("/test")
public class ValueController {
@Autowired
CarpollingServiceImpl carpollingService;
@GetMapping("/getValue")
public String getValue(){
return carpollingService.getValue();
}
}
配置类代码:
@Configuration
public class CarpollingServiceImpl {
@Value("#{userBean.name}")
private String port;
public String getValue() {
return port;
}
}
@PropertySource
如果将所有的配置都集中到 application.properties 或 application.yml
中,那么这个配置文件会十分的臃肿且难以维护,因此我们通常会将与Spring Boot 无关的配置(例如自定义配置)提取出来,写在一个单独的配置文件中,并在对应的 JavaBean 上使用 @PropertySource 注解指向该配置文件。
我们也可以自定义配置文件,例如新建 db.properties ,配置内容如下:
pro.username=admin
pro.password=123456
pro.birthday=2000/12/01
pro.age=23
pro.books={jsp:36,html:360,spring:65}
pro.hobby=23,34
pro.list=sprig,myatis
配置类:
@Component
@PropertySource("classpath:db.properties")
@Data
public class User {
@Value("${pro.username}")
String username;
@Value("${pro.password}")
String password;
@Value("${pro.birthday}")
Date birthday;
}
注: 该注解只能引用properties文件
配置属性校验
自定义配置文件时,可以使用@Validated注解对注入的值进行一些简单的校验,示例代码:
Testconfig.java
@Validated
@Configuration
@ConfigurationProperties(prefix = "sb")
public class Testconfig {
@Max(value = 123)
private String password;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
测试
@Autowired
Testconfig testconfig;
@Test
void a() {
System.out.println(testconfig.getPassword());
}
抛出错误,最大值不能超过123
@Max(value = 123)注解会对注入的值进行校验,如果不是小于123的将会报错抛出
其它常见注解:
@AssertFalse 校验false
@AssertTrue 校验true
@DecimalMax(value=,inclusive=) 小于等于value,inclusive=true,
是小于等于
@DecimalMin(value=,inclusive=) 与上类似
@Max(value=) 小于等于value
@Min(value=) 大于等于value
@NotNull 检查Null
@Past 检查日期
@Pattern(regex=,flag=) 正则
@Size(min=, max=) 字符串,集合,map限制大小
@Validate 对po实体类进行校验
上述的这些注解位于javax.validation.constraints包下, SpringBoot 2.3.0以后maven引用:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
@Value 与 @ConfigurationProperties对比
@Value 和 @ConfigurationProperties 注解都能读取配置文件中的属性值并绑定到 JavaBean 中,但两者存在以下不同。
1. 使用位置不同
@ConfigurationProperties:标注在 JavaBean 的类名上;
@Value:标注在 JavaBean 的属性上。
2. 功能不同
@ConfigurationProperties:用于批量绑定配置文件中的配置;
@Value:只能一个一个的指定需要绑定的配置。
3. 松散绑定支持不同
@ConfigurationProperties:支持松散绑定(松散语法),例如实体类Person 中有一个属性为 firstName,那么配置文件中的属性名支持以下写法:
person.firstName
person.first-name
person.first_name
PERSON_FIRST_NAME
@Vaule:不支持松散绑定。
4. SpEL 支持不同
@ConfigurationProperties:不支持 SpEL 表达式;
@Value:支持 SpEL 表达式。
5. 复杂类型封装
@ConfigurationProperties:支持所有类型数据的封装,例如 Map、 List、Set、以及对象等;
@Value:支持基本数据类型的封装,例如字符串、布尔值、整数等类型, 对集合Map list set配置有要求
6.属性校验
@Value不支持属性校验
@ConfigurationProperties 支持属性校验
7. 应用场景不同
@Value 和 @ConfigurationProperties 两个注解之间,并没有明显的优劣之分,它们只是适合的应用场景不同而已。
若只是获取配置文件中的某项值,则推荐使用 @Value 注解;
若专门编写了一个 JavaBean 来和配置文件进行映射,则建议使用 @ConfigurationProperties 注解。
我们在选用时,根据实际应用场景选择合适的注解能达到事半功倍的效果
来源:https://blog.csdn.net/weixin_50843918/article/details/124547706
猜你喜欢
- 扫码枪扫码效果等同于键盘录入,会回调dispatchKeyEvent键盘按下事件。开发环境:有线扫码枪,支持二维码代码1. 接收数据 /**
- 一.BASIC认证概述在HTTP协议进行通信的过程中,HTTP协议定义了基本认证过程以允许HTTP服务器对WEB浏览器进行用户身份证的方法,
- 影响排序效率的一般从3个方面比较:数据比较的次数,数据移动的次数,内存空间占用的大小。我们就冒泡排序、选择排序、插入排序、快速排序做一个总的
- ProgressBar进度条当一个应用在后台执行时,前台界面不会有任何信息,这时,用户根本不知道程序是否在执行以及执行的进度等, 因此需要使
- 本文实例讲述了Android开发使用自定义View将圆角矩形绘制在Canvas上的方法。分享给大家供大家参考,具体如下:前几天,公司一个项目
- 如果不熟悉Java8新特性的小伙伴,初次看到函数式接口写出的代码可能会是一种懵逼的状态,我是谁,我在哪,我可能学了假的Java,(・∀・(・
- 本文的主要内容包括在下图,下面来一起看看吧。1、&和&&的区别2、switchswitch语句能否作用在byte,能
- unity贪吃蛇基本原理实现,供大家参考,具体内容如下原理:1、每个身体跟着前面的身体移动;2、蛇头自动一直向前走,可以向左或者向右转弯。思
- 因为项目中之前的模块用的分页插件是Datatables,很方便,但是新做的模块表格中的布局有变化,Datatables插件满足不了了。为了风
- 前言本文告诉大家一些 ValueTuple 的原理,避免在使用出现和期望不相同的值。ValueTuple 是 C# 7 的语法糖,如果使用的
- 本文实例为大家分享了android studio实现简单计算器的具体代码,供大家参考,具体内容如下布局:<?xml version=&
- try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。try catch组合 : 对代
- 最近在看《.NET游戏编程入门经典 C#篇》 第一章介绍了如何制作俄罗斯方块,自己试了试按照书上的步骤,可算是完成了。于是写下这篇文章留作纪
- 前言最近搭建的springbootboot的网关,配置请求路径,竟然没有生效现象配置文件如下:启动类,控制台打印的结果如下:我随便更换端口都
- Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,它是一种基于64个可打印字
- 背景笔者使用 Spring Security 5.8 时,发现网上很多教程所教的 Spring Security 配置类 SecurityC
- 记录web项目部署到阿里云服务器步骤(使用 web项目、阿里云服务器、Xftp、Xshell),敬请参考和指正1.将要部署的项目打包成WAR
- 情景描述将一个时间转换为对应的unix时间戳,字符集使用UTF-8编码,数据通讯统一采用 HTTP 协议通讯,使用POST 方法请求并传递参
- Objects工具类jdk 1.7引进的工具类,都是静态调用的方法,jdk 1.8新增了部分方法重点方法equals用于字符串和包装对象的比
- 手势操作可以说是智能手机的一种魅力所在,前两节给大家讲解了两种有趣的手势操作,