SpringBoot 有两种格式的全局配置文件
SpringBoot 使用任何一种全局配置文件功能都是一样的,配置文件名是固定的,作用都是修改 SpringBoot 自动配置的默认值
1)application.properties Spring initializr 默认自动生成 properties 配置文件
2)application.yml SpringBoot 还支持 YAML配置文件
一、YAML简介
yml 是YAML(YAML Ain't Markup Language)语言的文件,以数据为中心,比json、xml等更适合做配置文件
yml 和 xml 相比,少了一些结构化的代码,使数据更直接,一目了然。
ym l和 json 呢?没有谁好谁坏,合适才是最好的。yml的语法比json优雅,注释更标准,适合做配置文件。json作为一种机器交换格式比yml强,更适合做api调用的数据交换。
1、YAML文件的语法格式 参考文章:yaml语法规范
key:(空格)value
注意不能用tab代替空格。
3)大小写敏感(严格区分大小写),支持字面值,对象,数组三种数据结构,也支持复合结构。
在值里用 “不会转义特殊字符,\n会换行”,‘会转义特殊字符,\n会输出’
‘#’ 表示注释,只能单行注释,从#开始处到行尾
字面值:字符串,布尔类型,数值,日期。字符串默认不加引号,单引号会转义特殊字符。日期格式支持 yyyy/MM/dd HH:mm:ss
对象或 Map 集合:由键值对组成,表示方法有两种:
① 换行缩进:由形如 key:(空格)value 的数据组成。冒号后面的空格是必须要有的,每组键值对占用一行,且缩进的程度要一致
② 行内写法(利用大括号):{k1: v1,....kn: vn}
数组或 List 集合:也有两种表达方式:
① 换行缩进:由形如 -(空格)value 的数据组成。短横线后面的空格是必须要有的,每组数据占用一行,且缩进的程度要一致
② 行内写法(利用中括号):[v1,v2,...vn]
复合结构:上面三种数据结构任意组合
二、Properties简介
1、properties文件的编写语法
1)properties文件是一个文本文件
2)properties文件的语法有两种:
一种是注释:注释前面加上#号。
一种是属性配置:以“键=值”的方式书写一个属性的配置信息。
3)properties文件的一个属性配置信息值可以换行,但键不可以换行。值换行用“\”表示。
4)properties文件的属性配置键值前后的空格在解析时候会被忽略。
5)properties文件可以只有键而没有值。也可以仅有键和等号而没有值,但无论如何一个属性配置不能没有键。
6)父属性和子属性之间是以“.”进行区分。
三、全局配置文件中配置数据与JavaBean绑定
(1)通过注解@ConfigurationProperties从全局配置文件中获取数据
1、创建两个JavaBean:User和Address,并添加注解
通过SpringBoot提供的注解 @ConfigurationProperties(prefix = "")
2、在pom.xml中引入配置依赖
要在YAML配置文件中配置User类的属性数值时,这个依赖会给我们自动代码提示
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
3、使用任意一个配置文件中配置内容:
1)application.properties
server.port=80
#user类
user.id=2001
user.username=李四
user.pazzword=lisi123
user.birthday=2019/05/08
user.list=aaa,bbb,ccc
user.map.key1=value1
user.map.key2=value2
user.address.id=2001
user.address.detail=浙江杭州
2)application.yml
server:
port: 80
#user类
user:
id: 1001
username: 张三
pazzword: zhangsan123
age: 18
sex: true
birthday: 2019/05/07 10:42:01
list:
- list1
- list2
- list3
map:
key1: value1
key2: value2
address:
id: 1002
detail: 浙江杭州
如果集合里面是对象时,如:List<Address> lists
lists:
- id: 1002
detail: 浙江杭州
- id: 1003
detail: 浙江义乌
4、在spring boot的测试单元上测试(SpringBoot 的单元测试支持对象注入比junit安逸多了)
(2)通过注解@Vuale从全局配置文件中获取数据
spring提供了一个@Value注解,获取全局配置文件中的某个配置项的数据
@Value("${}") 获取全局配置文件的数据
@Value("#{}") #{} 里面写 spring表达式,可以计算后注入数据
@Value("") 直接写字面量的普通值注入数据
@Component
//@ConfigurationProperties(prefix = "user")
public class User implements Serializable {
private static final long serialVersionUID = 5423119138162218022L;
@Value("${user.id}")
private long id;
@Value(value = "${user.username}")
private String username;
@Value(value = "${user.pazzword}")
private String pazzword;
@Value("#{10+18}")
private int age;
@Value("true")
private boolean sex; //ture-男, false-女
@Value("2019/05/10")
private Date birthday;
private List<String> list;
private Map<String, Object> map;
private Address address;
get/set方法
}
运行测试类:
两个注解的的区别:
@ConfigurationProperties:是和JavaBean的所有属性绑定
@Value:是一个一个属性绑定
@ConfigurationProperties:不支持spring表示式的写法
@Value:支持spring的表达式的写法,#{12+13}
@ConfigurationProperties:支持JSR303数据校验
@Value:不支持JSR303数据校验
@ConfigurationProperties:支持复杂类型的绑定,比如Map,List
@Value:不支持复杂的类型绑定,比如${user.map}是读不出数据的
四、在 resources目录下,自定义 user.properties 文件
项目启动并不会自动的加载该自定义配置文件,
如果在 XML 配置中,通过如下方式引用该 properties 文件:
<context:property-placeholder location="classpath:user.properties"/>
如果在 Java 配置中,通过 @PropertySource 来引入该 properties 文件:
@Component
@PropertySource("classpath:user.properties")
@ConfigurationProperties(prefix = "user")
public class User implements Serializable {
...
}
此时,当项目启动时,就会自动加载 user.properties 文件。这只是 Spring 中属性注入的用法,和 Spring Boot没有任何关系。然后使用按需选择@ConfigurationProperties还是@Vuale注解。
结论或建议:
1)当有JavaBean与全局配置文件里的数据对应的时候,就使用@ConfigurationProperties注解
2)当只是需要配置文件中某一个值的时候,就使用@Value注解
3)在resources目录下创建两个配置文件,一个为application.yml配置文件,另一个为application.properties配置文件;
结论:在同一目录下,properties配置优先级 > YAML配置优先级。//所以我们在jar包启动时带上properties写法的配置可以覆盖配置