4springboot的配置文件及yml使用
Posted 素然止步
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4springboot的配置文件及yml使用相关的知识,希望对你有一定的参考价值。
配置文件
作用:spring boot 自动配置(约定,8080 ).可以使用配置文件 对默认的配置 进行修改
application.properties的修改方式
yml修改方式
例子:
把默认端口8080修改为8888,访问成功:
默认全局配置文件有两种类型:
application.properties
操作:application.properties采用 :key=value 形式进行配置,无论是配置什么类型的数据,都是 k = v 形式配置,有时候给一个类的属性赋值,这个属性套了很多层,那么只有k变长一点,value不变,例: server.servlet.encoding.charset= UTF-8 ,server.servlet.encoding.charset这个是key , 后面的UTF-8是值。
application.yml
application.yml : yaml ain\'t myarkup language ,不是一个标记文档
xml:是一个标记文档,如下:
<server> <port>8882</port> <path>/a/b/c</path> </server>
yml语法
- key:空格value
- 通过垂直对齐 指定层次关系
- value默认可以不写引号; ""会将其中的转义符进行转义(也就是说加了双引号的value,里面如果包含\\n换行会生效,而单引号/不加任何符号则直接输出),其他不会
yml写法有两种形式,不过只有Java的八大基本数据类型是不区分 行内写法/垂直对齐写法
yml行内写法
接下来用下面的例子展示yml不同数据类型的行内写法
yml除了可以配置之外,还可以属性绑定:
例:创建一个实体类对象,并且绑定属性
@Component //把实体类加入ioc容器 @ConfigurationProperties(prefix = "student") //属性绑定声明 这里的student对应yml那边的student public class Student { private String name; //字符串类型 private int age; //整型 private boolean sex; //布尔型 private Date birthday; //日期型 private Map<String,Object> location; //Map集合 private String[] hobbies; //字符串数组 private List<String> skills; // list集合 private Pet pet;//宠物 //对象类型 getter/setter方法省略,自己可以生成
toString省略 }
补充Pet类:
public class Pet { int age; String name; getter/setter省略
toString省略 }
然后在yml配置文件注入值,首先是使用行内写法:
Student:
name: zs
age: 23
sex: true
#上面三个都是基本数据类型,不区分写法,直接写
#日期类型
birthday: 2019/02/12
#map集合
location: {province: 广东,city: 广州,zone: 增城区}
#数组和list\\set集合 输入格式一样 ,中括号可以省略
hobbies: [足球,篮球]
#list集合
skills: [编程,金融]
#对象类型
pet: {name: wc11,strain: hsq}
总结:行内写法,map集合和对象类型一样形式是 {key:空格value , .. };数组和list/set集合都一样是[a,b,c] 中括号还可以省略。
yml垂直对齐写法
Student:
name: zs
age: 23
sex: true
#上面三个都是基本数据类型,不区分写法,直接写
#日期类型
birthday: 2019/02/12
#map集合
location:
province: 广东
city: 广州
zone: 增城区
#数组和list\\set集合 输入格式一样
hobbies:
- 足球
- 篮球
#list集合
skills:
- 编程
- 金融
#对象类型
pet:
name: wc11
age: 12
垂直对齐形式,map集合和对象类型是同一写法,格式如下:
map/对象类型
key:空格value
key:空格value
而数组和list/set集合也一样,格式如下:
数组/list/set:
-空格xx
-空格xx
数据绑定后,在测试类里面装配一个学生对象测试:
数据绑定成功,如上图输出了绑定的数据信息, yml里面配置的属性确实打印出来的,测试成功。
注意:@Qualifier()注解要结合@Autowire()注解才生效,另外属性绑定是通过yml的头部的student和实体类声明的@ConfigurationProperties(prefix = "student")名字对应才生效,忽略大小写。
yml总结:
application.properties配置方式 : key=value
application.yml配置方式:
1. key:空格value 简单属性配置
2.通过垂直对齐 指定层次关系
3.value默认可以不写引号; ""会将其中的转义符进行转义,其他不会
数据类型yml的两种配置方式:
1、list/set/数组
1.1 行内写法 hobbies: [足球,篮球] 中括号可省略
1.2 垂直方式 hobbies:
- 足球
- 篮球
2、对象/map
2.1 行内写法 location :{province: 广东,city: 广州,zone: 增城区} 注意v前面有空格
2.2 垂直方式 location :
province: 广东
city: 广州 通过垂直对齐表示层次关系
属性注入
上面我们举的yml属性注入例子,是通过@ConfigurationProperties()注解来实现绑定的,还有一个注解可以实现属性绑定注入。
那就是 @Value("xx")注解,@Value注解可以直接写到实体类的属性上面,也可以通过springEL表达式,在配置文件中获取注入的值。
例子:
上面的例子,我结合了两个注解的使用,也就是@Value()和@ConfigurationProperties(),他们的属性都已经绑定注入了,控制台也输出了结果,可以发现是可以结合使用的,另外在yml没设置name属性是因为,会覆盖@Value()的注入,配置文件的优先级高于@Value()注解。
补充:.properties和.yml文件同时配置一个相同属性,.properties的会生效,因为优先级高。
@Value()和@ConfigurationProperties()区别
@configurationProperties | @Value | |
注值方式 | 批量注入 | 单个注入 |
松散语法 | 支持 | 不支持 |
SpringEL语法 | 不支持 | 支持 |
JSR303数据检验 | 支持 | 不支持 |
注入复杂类型 | 支持 | 不支持 |
1、松散语法:对类似的格式,限制不那么严格,比如:变量 userName = user_name = user-name ,这个三个在松散语法里面都是指同一个属性。
在yml里面写了 Student.user-name="zs" ,那边的实体类名字虽然是userName,但是还是会被注入值。
2、SpringEL语法:格式 ${对象.变量名},注意只能在@Value注解中使用,因为只有@Value支持SpEL语法,如下
3、JSR303数据检验:例如我有一个属性是Email,那么注册的时候需要写if语句/正则表达式判断是否为邮箱类型,有了JSR303数据检验就可以用一个注解搞定,如下:
@Validated //开启jsr303数据检验的注解 public class Student { @Email String email;
然后在yml文件那边邮箱乱填一些数据,运行如下图:
如果邮箱格式错误,就会抛出异常,另外我这个@Email注解使用的依赖如下:
<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-validator</artifactId> <version>5.2.4.Final</version> </dependency>
注意,@Email注解使用依赖版本太高(例如:6.0.18版本)会无效,甚至运行不起来。
下面测试@Value()注解不支持JSR303数据检验:
还有一个复杂类型注入就不测试了,只有@configuration支持注入复杂数据类型,@Value注解不支持复杂类型注入,上面的表格可以自己测试一下。
@PropertySource
作用:指定配置文件被加载。
springboot默认会加载application.properties/application.yml文件中的数据,但是如果自己配置的属性不在这两个文件中呢,比如我在conf.properties中配置了属性,那么就要使用@PropertySource注解在实体类加载conf.properties配置文件。
@PropertySource(value = "{classpath:conf.properties}") //声明当前student实体类加载conf.properties配置文件 public class Student { ...
但是,@PropertySource注解只能加载.properties文件,不能加载.yml文件.
The end.
以上是关于4springboot的配置文件及yml使用的主要内容,如果未能解决你的问题,请参考以下文章
3springboot:springboot配置文件(配置文件YAML属性文件值注入<@Value@ConfigurationProperties@PropertySource,@Imp(代码片
SpringBoot中yml配置文件:定义list集合数组及注意事项