Spring Boot提供了两种常用的配置文件,分别是properties文件和yml文件。他们的作用都是修改Spring Boot自动配置的默认值。
技术:yaml、properties语法,ConfigurationProperties和Value注解的使用,配置文件占位符的使用
一、YAML简介
yml是YAML(YAML Ain't Markup Language)语言的文件,以数据为中心,比json、xml等更适合做配置文件
yml和xml相比,少了一些结构化的代码,使数据更直接,一目了然。
yml和json呢?没有谁好谁坏,合适才是最好的。yml的语法比json优雅,注释更标准,适合做配置文件。json作为一种机器交换格式比yml强,更适合做api调用的数据交换。
一)YAML语法
以空格的缩进程度来控制层级关系。空格的个数并不重要,只要左边空格对齐则视为同一个层级。注意不能用tab代替空格。且大小写敏感。支持字面值,对象,数组三种数据结构,也支持复合结构。
字面值:字符串,布尔类型,数值,日期。字符串默认不加引号,单引号会转义特殊字符。日期格式支持yyyy/MM/dd HH:mm:ss
对象:由键值对组成,形如 key:(空格)value 的数据组成。冒号后面的空格是必须要有的,每组键值对占用一行,且缩进的程度要一致,也可以使用行内写法:{k1: v1, ....kn: vn}
数组:由形如 -(空格)value 的数据组成。短横线后面的空格是必须要有的,每组数据占用一行,且缩进的程度要一致,也可以使用行内写法: [1,2,...n]
复合结构:上面三种数据结构任意组合
二)YAML的运用
创建一个Spring Boot 的全局配置文件 application.yml,配置属性参数。主要有字符串,带特殊字符的字符串,布尔类型,数值,集合,行内集合,行内对象,集合对象这几种常用的数据格式。
yaml: str: 字符串可以不加引号
specialStr: "双引号直接输出\n特殊字符"
specialStr2: '单引号可以转义\n特殊字符'
flag: false
num: 666
Dnum: 88.88
list:
- one
- two
- two
set: [1,2,2,3]
map: {k1: v1, k2: v2}
positions:
- name: ITDragon
salary: 15000.00
- name: ITDragonBlog
salary: 18888.88
创建实体类YamlEntity.java 获取配置文件中的属性值,通过注解@ConfigurationProperties获取配置文件中的指定值并注入到实体类中。其具体的测试方法和获取值的原理,请继续往后看!
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* YAML 语法实体类
* 切记点:
* 一、冒号后面加空格,即 key:(空格)value
* 二、每行参数左边空格数量决定了该参数的层级,不可乱输入。
*/@Component@ConfigurationProperties(prefix = "yaml")
public class YamlEntity {
// 字面值,字符串,布尔,数值
private String str; // 普通字符串
private String specialStr; // 转义特殊字符串
private String specialStr2;// 输出特殊字符串
private Boolean flag; // 布尔类型
private Integer num; // 整数
private Double dNum; // 小数
// 数组,List和Set,两种写法: 第一种:-空格value,每个值占一行,需缩进对齐;第二种:[1,2,...n] 行内写法
private List<Object> list; // list可重复集合
private Set<Object> set; // set不可重复集合
// Map和实体类,两种写法:第一种:key空格value,每个值占一行,需缩进对齐;第二种:{key: value,....} 行内写法
private Map<String, Object> map; // Map K-V
private List<Position> positions; // 复合结构,集合对象
// 省略getter,setter,toString方法
}
三)YML小结
一、字符串可以不加引号,若加双引号则输出特殊字符,若不加或加单引号则转义特殊字符;
二、数组类型,短横线后面要有空格;对象类型,冒号后面要有空格;
三、YAML是以空格缩进的程度来控制层级关系,但不能用tab键代替空格,大小写敏感;
四、如何让一个程序员崩溃?在yml文件中加几个空格!
二、Properties简介
properties文件大家经常用,这里就简单介绍一下。其语法结构形如:key=value。注意中文乱码问题,需要转码成ASCII。具体如下所示:
userinfo.account=itdragonBlog
userinfo.age=25
userinfo.active=true
userinfo.created-date=2018/03/31 16:54:30
userinfo.map.k1=v1
userinfo.map.k2=v2
userinfo.list=one,two,three
userinfo.position.name=Java架构师
userinfo.position.salary=19999.99
从配置文件中取值注入到实体类中,和YAML是一样的。
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 用户信息
* @ConfigurationProperties : 被修饰类中的所有属性会和配置文件中的指定值(该值通过prefix找到)进行绑定
*/@Component@ConfigurationProperties(prefix = "userinfo")
public class UserInfo {
private String account;
private Integer age;
private Boolean active;
private Date createdDate;
private Map<String, Object> map;
private List<Object> list;
private Position position;
// 省略getter,setter,toString方法
}
三、配置文件取值
Spring Boot通过ConfigurationProperties注解从配置文件中获取属性。从上面的例子可以看出ConfigurationProperties注解可以通过设置prefix指定需要批量导入的数据。支持获取字面值,集合,Map,对象等复杂数据。ConfigurationProperties注解还有其他特么呢?它和Spring的Value注解又有什么区别呢?
一)ConfigurationProperties和Value优缺点
ConfigurationProperties注解的优缺点
一、可以从配置文件中批量注入属性;
二、支持获取复杂的数据类型;
三、对属性名匹配的要求较低,比如user-name,user_name,userName,USER_NAME都可以取值;
四、支持JAVA的JSR303数据校验;
五、缺点是不支持强大的SpEL表达式;
Value注解的优缺点正好相反,它只能一个个配置注入值;不支持数组、集合等复杂的数据类型;不支持数据校验;对属性名匹配有严格的要求。最大的特点是支持SpEL表达式,使其拥有更丰富的功能。
二)@ConfigurationProperties详解
第一步:导入依赖。若要使用ConfigurationProperties注解,需要导入依赖 spring-boot-configuration-processor;
第二步:配置数据。在application.yml配置文件中,配置属性参数,其前缀为itdragon,参数有字面值和数组,用来判断是否支持获取复杂属性的能力;
第三步:匹配数据。在类上添加注解ConfigurationProperties,并设置prefix属性值为itdragon。并把该类添加到Spring的IOC容器中。
第四步:校验数据。添加数据校验Validated注解,开启数据校验,测试其是否支持数据校验的功能;
第五步:测试ConfigurationProperties注解是否支持SpEL表达式;
导入依赖:pom.xml 添加 spring-boot-configuration-processor依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
配置数据:application.yml 配置属性参数,nick-name是用来判断匹配属性的松散性,若换成nick_name依然可以获取值。
itdragon:
nick-name: ITDragonBlog
email: 1234567890@qq.com
iphone: 1234567890
abilities: [java, sql, html]
created_date: 2018/03/31 15:27:30
匹配和校验数据:
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
/**
* ConfigurationProperties 注解语法类
* 第一步:导入依赖 spring-boot-configuration-processor;
* 第二步:把ConfigurationProperties注解修饰的类添加到Spring的IOC容器中;
* 第三步:设置prefix属性,指定需要注入属性的前缀;
* 第四步:添加数据校验注解,开启数据校验;
*
* 注意点:
* 一、nickName和createdDate在yml配置文件中,对应参数分别是中划线和下划线,用于测试其对属性名匹配的松散性
* 二、email和iphone 测试其支持JSR303数据校验
* 三、abilities 测试其支持复杂的数据结构
*/@Component@ConfigurationProperties(prefix = "itdragon")
@Validatedpublic class ConfigurationPropertiesEntity {
private String nickName; // 解析成功,支持松散匹配属性
private String email;
// @Email // 解析失败,数据校验成功:BindValidationException: Binding validation errors on itdragon
private String iphone;
private List<String> abilities;
private Date createdDate; // 解析成功,支持松散匹配属性
// @ConfigurationProperties("#{(1+2-3)/4*5}")
private String operator; // 语法报错,不支持SpEL表达式:not applicable to field
// 省略getter,setter,toString方法
}
三)@Value详解
第一步:在属性上添加Value注解,通过${}设置参数从配置文件中注入值;
第二步:修改${itdragon.ceatred_date}中的参数值,改为${itdragon.ceatredDate}测试是否能解析成功;
第三步:添加数据校验Validated注解,开启数据校验,测试其是否支持数据校验的功能;
第四步:测试Value注解是否支持SpEL表达式;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.Email;
import java.util.Date;
import java.util.List;
/**
* Value 注解语法类
* 第一步:在属性上添加注解Value注入参数
* 第二步:把Value注解修饰的类添加到Spring的IOC容器中;
* 第三步:添加数据校验注解,检查是否支持数据校验;
*
* 注意点:
* 一、nickName和createdDate在yml配置文件中,对应参数分别是中划线和下划线,用于测试其对属性名匹配的松散性
* 二、email和iphone 测试其支持JSR303数据校验
* 三、abilities 测试其支持复杂的数据结构
*
* 结论:
* 一、createDate取值必须和yml配置文件中的参数保持一致,
* 二、既是在iphone上添加邮箱验证注解依然可以通过测试,
* 三、不支持复杂的数据结构,提示错误和第一条相同:IllegalArgumentException: Could not resolve placeholder 'itdragon.abilities' in value "${itdragon.abilities}"
*/@Component@Validatedpublic class ValueEntity {
@Value("${itdragon.nick-name}")
private String nickName;
@Value("${itdragon.email}")
private String email;
@Email
@Value("${itdragon.iphone}") // 解析成功,并不支持数据校验
private String iphone;
// @Value("${itdragon.abilities}") // 解析错误,并不支持复杂的数据结构
private List<String> abilities;
// @Value("${itdragon.ceatredDate}") // 解析错误,并不支持松散匹配属性,必须严格一致
private Date createdDate;
// Value注解的强大一面:支持SpEL表达式
@Value("#{(1+2-3)/4*5}") // 算术运算
private String operator;
@Value("#{1>2 || 2 <= 3}") // 关系运算
private Boolean comparison;
@Value("#{systemProperties['java.version']}") // 系统配置:os.name
private String systemProperties;
@Value("#{T(java.lang.Math).abs(-18)}") // 表达式
private String mapExpression;
// 省略getter,setter,toString方法
}
四)配置文件取值小结
一、ConfigurationProperties注解支持批量注入,而Value注解适合单个注入;
二、ConfigurationProperties注解支持数据校验,而Value注解不支持;
三、ConfigurationProperties注解支持松散匹配属性,而Value注解必须严格匹配属性;
四、ConfigurationProperties不支持强大的SpEL表达式,而Value支持;
总结
一、Spring Boot 支持两种格式的配置文件,其中YAML的数据结构比properties更清晰。
二、YAML 是专门用来写配置文件的语言,非常简洁和强大。
三、YAML 对空格的要求很严格,且不能用Tab键代替。
四、YAML 通过空格缩进的程度确定层级,冒号后面有空格,短横线后面有空格。
五、ConfigurationProperties注解适合批量注入配置文件中的属性,Value注解适合获取配置文件中的某一项。
六、ConfigurationProperties注解支持数据校验和获取复杂的数据,Value注解支持SpEL表达式。
- SpringBoot中各配置文件的优先级及加载顺序
我们在写程序的时候会碰到各种环境(开发.测试.生产),因而,在我们切换环境的时候,我们需要手工切换配置文件的内容.这大大的加大了运维人员的负担,同时会带来一定的安全隐患. 为此,为了能更合理地重写各属 ...
- SpringBoot中使用配置文件
一般都是把xml配置文件转换为@Bean的模式,如果非要使用xml配置文件,方式如下: /** * 将配置文件引入springboot */ @Configuration @ImportResourc ...
- SpringBoot中yml配置文件
1.yml配置文件书写格式 格式是在普通配置文件中以“.”分割的属性名称,该为“: ”和换行. 例子: //普通格式 spring.datasource.driver-class-name=com.m ...
- springboot中引用配置文件中的参数
首先可以看到这是做微信登陆时候的配置,一般不会写死都是通过配置文件获取,所以,记载配置文件中 那么怎么引用呢: 可以看到直接注入的方式就可以引用了,所以看下面: 进行页面跳转,并且带有参数的, 使用m ...
- springBoot 中 logback配置文件详解
logback介绍和配置详解 logback是Java的开源框架,性能比log4j要好.是springboot自带的日志框架.该框架主要有3个模块: logback-core:核心代码块(不介绍) l ...
- SpringBoot中的配置文件
http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
- SpringBoot中读取配置文件的几种方式
1.读取application文件 在application.yml或者properties文件中添加: info: name: xiaoming age: 13 sex: 1 读取方式如下: imp ...
- SpringBoot中resources配置文件application.properties
#项目名server.servlet.context-path=/springboot-day1#端口号server.port=8989 #datasource数据库连接信息#urlspring.da ...
- SpringBoot起飞系列-配置文件(三)
一.SpringBoot中的配置文件 说起到配置文件,大家并不陌生,早在springboot之前,我们用ssh,ssm框架开发的时候整天都要接触配置文件,那时候的配置文件基本上都是.propertie ...
随机推荐
- C# protobuf自动更新cs文件
网上的教程大都是手动通过protoc编译, 比较难用 给当前工程添加"Google.Protobuf"和"Grpc.Tools"的引用(通过nuget), 然后 ...
- Android中实现自定义View组件并使其能跟随鼠标移动
场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建An ...
- 虚拟机中给linux 系统添加硬盘以后,进行分区挂载
当自己虚拟机中的linux 系统硬盘不够用的时候需要添加硬盘给系统使用,所以可以通过以下的步骤实现 1.关闭自己的客户机,然后执行以下步骤 2. 上面的步骤完成以后,重点来了,下面打开客户机,执行以下 ...
- 关于建立 Carbon Forum 后 设置访问链接的问题
如果不想访问的是根目录可以如下设置. location /cf { try_files $uri $uri/ /cf/index.php?$query_string;} 这样访问 /cf 目录就可以访 ...
- Python 编程入门(2):复杂数据类型(列表,字典)
以下所有例子都基于最新版本的 Python,为了便于消化,每一篇都尽量短小精悍,希望你能尽力去掌握 Python 编程的「概念」,可以的话去动手试一下这些例子(就算目前还没完全搞懂),加深理解. 在 ...
- Null项目参与排序
1.item1升序,item2升序,item3(存在NULL项目,NULL项目排在后面)升序 Collections.sort(list, Comparator.comparing(Bean::g ...
- 纪中10日T3 2296. 神殿 bfs
2296. 神殿 (File IO): input:temple.in output:temple.out 时间限制: 1500 ms 空间限制: 524288 KB 具体限制 Goto Prob ...
- opencv —— copyTo 设置与操作感兴趣区域(ROI)
感兴趣区域:ROI 对感兴趣区域进行的一系列操作,相当于直接在原图相应部分进行操作. Mat imageROI = srcImage(Rect(0,0,dstImage.cols, dstImage. ...
- 关于 DP 的一些内容
0.关于 动态规划是编程解题的一种重要手段.1951 年美国数学家 R.Bellman 等人,根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解 ...
- 字节跳动挤上少儿英语末班车,gogokid能否抵达终点?
编辑 | 于斌 出品 | 于见(mpyujian) 近日,据多方消息,字节跳动旗下少儿英语品牌gogokid,迎来了一位新的90后CEO金钱琛.据知情人士透露,金钱琛入职不到两个月,目前全面掌管gog ...