yml 与 properties
我们都会发现在 resource 有一个配置文件 application.properties,也有可能是application.yml.这个文件也就是 Spring Boot 默认的的配置文件。
yml的数据格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| server: port: 8080
person: last-name: Darcy age: 20 birth: 2018/01/01 email: gmail@gmail.com maps: key1:java key2:golang lists: - a - b - c dog: name: 旺财 age: 2
|
properties的数据格式:
1 2 3 4 5 6 7 8 9 10 11 12 13
| server.port=8080
person.last-name=张三 person.age=18 person.birth=2018/12/06 person.email=niu@gmail.com person.maps.key1=c person.maps.key2=java person.maps.key3=golang person.lists=a,b,c,d person.dog.name=旺财 person.dog.age=1
|
随机数和占位符
RandomValuePropertySource 类对于注入随机值很有用(例如,注入秘密或测试用例)。它可以生成整数,长整数,uuid 或字符串等,通过 Spring Boot 对我们的封装,我们可以轻松的使用。
占位符允许在配置的值中引用之前定义过的变量。
1 2 3 4 5 6 7 8 9 10
| bootapp.secret=$ {random.value} bootapp.number=$ {random.int} bootapp.bignumber=$ {random.long} bootapp.uuid=$ {random.uuid} bootapp.number.less.than.ten=$ {random.int(10)} bootapp.number.in.range=$ {random.int [1024,65536]}
bootapp.name=SpringBoot bootapp.description=${bootapp.name}是一个spring应用程序
|
@ConfigurationProperties
@ConfigurationProperties 注解是 Spring Boot 提供的一种使用属性的注入方法。不仅可以方便的把配置文件中的属性值与所注解类绑定,还支持松散绑定,JSR-303 数据校验等功能。
以上面演示的 Properties 的配置为例演示 @ConfigurationProperties 注解的使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Data @SpringBootConfiguration @ConfigurationProperties(prefix = "person") @Validated public class Person { private String lastName; @Max(150) private Integer age; private Date birth; private Map<String, String> maps; private List<String> lists;
@Email private String email; }
|
@Value
@Value 支持直接从配置文件中读取值,同时支持 SpEL 表达式,但是不支持复杂数据类型和数据验证,下面是具体的使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| @Data @Component @Validated public class PersonValue {
@Value("${person.last-name}") private String lastName;
@Value("#{11*4/2}") private Integer age;
@Value("${person.birth}") private Date birth;
private Map<String, String> maps; private List<String> lists;
@Email @Value("xxx@@@@") private String email; }
|
通过上面的示例,也可以发现 @ConfigurationProperties 和 @Value的区别:
特征 |
@ConfigurationProperties |
@Value |
功能 |
批量注入配置文件属性 |
一个一个注入 |
松散绑定(松散的语法) |
支持 |
不支持 |
SpEL |
不支持 |
支持 |
JSR-303 数据校验 |
支持 |
不支持 |
复杂类型 |
支持 |
不支持 |
@PropertySource
随着业务复杂性的增加,配置文件也越来越多,我们会觉得所有的配置都写在一个 properties 文件会使配置显得繁杂不利于管理,因此希望可以把映射属性类的配置单独的抽取出来。
这时可以使用 @PropertySource 注解来指定要读取的配置文件。
如果抽取 person 配置为单独文件 person.properties:
1 2 3 4 5 6 7 8
| person.last-name=张三 person.age=18 person.birth=2018/12/06 person.email=niu@gmail.com person.maps.key1=c person.maps.key2=java person.maps.key3=golang person.lists=a,b,c,d
|
配置类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Data @Component @Validated @PropertySource(value = "classpath:person.properties") @ConfigurationProperties(value = "person") public class PersonSource { private String lastName; private Integer age; private Date birth; private Map<String, String> maps; private List<String> lists;
@Email private String email; }
|