1、注入配置文件值-@ConfigurationProperties
yml配置文件:
person:
lastName: lurenyin
age: 20
student: true
birth: 1999/06/28
maps: {k1: v1,k2: v2}
lists:
- lurenyan
- springboot
Dog:
name: 狗子
age: 3
javaBean:
/**
* @ConfigurationProperties告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "person" 用来指明配置文件中哪个下面的所有属性进行一一映射;
* 只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能;
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean student;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
// 省略getter和setter方法以及toString
}
在此之前可以先导入配置文件处理器,这样我们以后在编写配置文件时就有提示啦!
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
2、properties配置文件的编码问题
接下来我们看一下properties配置文件的编写:
person.last-name=路人寅
person.age=20
person.student=true
person.birth=1999/06/28
person.maps.k1=v1
person.maps.k2=v2
person.lists=lurenyin,springboot
person.dog.name=狗子
person.dog.age=3
这样我们在启动测试运行的时候就可以看到打印输出结果了:
但是我们会发现我们的中文输出结果是乱码!原因是IDEA使用的是UTF-8编码,而properties文件使用的是ASCII编码,所以在运行时需要转成ASCII编码,我们需要修改以下设置:
这样乱码的问题就解决了:
3、注入配置文件值-@Value方法
yml配置文件同上;
javaBean:
/**
* Value值可以是字面量/${key}从配置文件中获取的值/#{SpEL}
* 这里我只注入了三个作为测试
*/
@Component
public class Person {
@Value("${person.lastName}")
private String lastName;
@Value("#{11*2}")
private Integer age;
@Value("true")
private Boolean student;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
//省略getter和setter方法以及toString
}
运行结果如下:
4、@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties | @Value | |
功能 | 批量注入配置文件中的属性 | 单个注入 |
松散语法 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR 303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
- 那松散语法该怎样理解呢?直白的上个例子:
先上个小知识点:属性名匹配规则:
标准方式:person.lastName
方式一:person.first-name
方式二:person.first_name
以上三种方式都可以使用;
properties配置文件里是这样滴:
@ConfigurationProperties支持松散语法是这样的情况,用@ConfigurationProperties方法注入:
这个运行是不会报错的,这里我就不运行啦~
@Value不支持松散语法是这样滴,用@Value方法注入:
lastName与配置文件里的last-name不一致,这个结果会报错!
- SpEL(Spring Expression Language),即Spring表达式语言,上个例子叭~
@ConfigurationProperties注入不支持SpEL:下面这种写法就是不可以的!
@Value注入支持SpEL:
- JSR 303数据校验也举个例子叭~
使用JSR 303数据校验要先加@Validated注解,还要导入下面的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
这里我拿@Email来测试,JSR 303 基本的校验规则可参看JSR303 | 易学教程
测试如下:
由于lurenyin不是邮箱格式,所以会报错,@Email校验起了作用,所以支持JSR 303校验。
@Value方法直接忽略JSR 303校验!所以不支持!
- 一个最主要的区别是@Value不支持复杂类型封装:
所以具体要使用哪种方式注入配置文件值,大家可以细细斟酌一下喔~
如果感觉有用的话可以给个赞不呀~