Spring boot配置绑定和配置属性校验的方式详解

网友投稿 361 2022-07-31


目录配置绑定先建立数据配置文件application.yml@ConfigurationProperties@Value第一种 @Value(“${}”)第二种@Value(“#{}”)@PropertySource配置属性校验@Value 与 @ConfigurationProperties对比1. 使用位置不同2. 功能不同3. 松散绑定支持不同4. SpEL 支持不同5. 复杂类型封装6.属性校验7. 应用场景不同

配置绑定

所谓配置绑定”就是把配置文件中的值与 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 mapList;

/************省略geter/seter方法*************/

}

只有在容器中的组件,才会拥有 SpringBoot 提供的强大功能。如果我们想要使用 @ConfigurationProperties 注解进行配置绑定,那么首先就要保证该对 JavaBean 对象在 IoC 容器中,所以需要用qzjRlex到 @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 Strinhttp://g 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 http://上使用 @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引用:

org.springframework.boot

spring-boot-starter-validation

@Value 与 @ConfigurationProperties对比

@Value 和 @ConfigurationProperties 注解都能读取配置文件中的属性值并绑定到 JavaBean 中,但两者存在以下不同。

1. 使用位置不同

@ConfigurationProperties:标注在 JavaBean 的类名上;@Value:标注在 JavaBean 的属性上。

2. 功能不同

@ConfigurationProperties:用于批量绑定配置文件中的配置;@Value:只能一个一个的指定需要绑定的配置。

3. 松散绑定支持不同

@ConfigurationProperties:支持松散绑定(松散语法),例如实体类Person 中有一个属性为 firstName,那么配置文件中的属性名支持以下写法:

person.firstNameperson.first-nameperson.first_namePERSON_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 注解。

我们在选用时,根据实际应用场景选择合适的注解能达到事半功倍的效果


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JavaSE详细讲解异常语法(javase编程题解)
下一篇:Java详细分析讲解泛型
相关文章

 发表评论

暂时没有评论,来抢沙发吧~