Springboot 中的配置文件

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

* 二、每行参数左边空格数量决定了该参数的层级,不可乱输入。

*/@[email protected](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找到)进行绑定

*/@[email protected](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: [email protected]

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 测试其支持复杂的数据结构

*/@[email protected](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}"

*/@[email protected] 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表达式。

原文地址:https://www.cnblogs.com/chx9832/p/11996602.html

时间: 2024-10-03 07:45:49

Springboot 中的配置文件的相关文章

关于springboot中的配置文件小知识

springboot中可以有多个配置文件,配置文件可以是.properties或则yml结尾的文件,并且配置文件有优先级,相同种类的配置application.properties 的优先级比较高,不同种类配置同时都会生效. 也可以自定义配置文件,随意命名,但是后缀名必须按照要求来!后台也可以通过@Value(“${key}”)注解来绑定值到属性: 原文地址:https://www.cnblogs.com/ljl5921/p/11801569.html

springboot中读取配置文件@Value和@Configuration

[email protected] package com.xgcd.springboot.bean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; import java

springboot中的配置文件绑定

先创建一个peron类,然后需要注解configurationProperties(prefix ="person")然后需要加一个@component因为只有在springboot的容器才能提供容器提供的@configurationProperties@Component @ConfigurationProperties(prefix = "person") public class Person { private String lastName; privat

springboot中配置文件使用1

1.表达方式:application.properties或者application.yml,这是已经约定成俗的文件,不用修改文件名,此文件为全局配置文件. 2.语法格式:yml或者yaml. a.基本语法: k:(空格)v  :表示一对键值对(空格必须有): 以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一层级的:如: server: port: 8081 path: /hello 属性和值也是大小写敏感: b.值得写法: 字面量: 普通的值(数字,字符串,布尔) k: v  :字

SpringBoot 中从yml配置文件中读取常用的参数值

SpringBoot现在基本上都是使用application-XXX.yml(生产环境为pro,开发测试环境为dev)来配置项目中的一些配置条件,在springboot中还可以通过从yml文件中将yml中的数据直接读取出来. 1.yml文件(这里设置参数的时候往往设置两层前缀,避免在调用的时候该属性中的部分参数名与计算机中的某些名字冲突) test: person: lastName: hello age: 18 boss: false birth: 2017/12/12 maps: {k1:

SpringBoot中使用Spring Data Jpa 实现简单的动态查询的两种方法

首先谢谢大佬的简书文章:http://www.jianshu.com/p/45ad65690e33# 这篇文章中讲的是spring中使用spring data jpa,使用了xml配置文件.我现在使用的是spring boot ,没有了xml文件配置就方便多了.我同样尝试了两种方式,也都是简单的查询,需要更复杂的查询,还需要我研究研究.往下看,需要先配置springboot的开发环境,需要大致了解springboot,这里可以看下面两篇文章: springboot 项目新建 springboot

SpringBoot 使用(三): 配置文件详解

代码从开发到测试要经过各种环境,开发环境,测试环境,demo环境,线上环境,各种环境的配置都不一样,同时要方便各种角色如运维,接口测试, 功能测试,全链路测试的配置,hardcode 肯定不合适,如Spring profile一样写在jar包不合适.分布式应用中一般采用集中管理配置的方式,通过使用开源软件,如阿里的diamond,hashicorp的consul等等,SpringBoot中提供了各种各样的配置方式,下面一一来分析下. 1.配置方式和优先级 这些方式优先级如下:a. 命令行参数b.

【springboot】之配置文件application

springboot使用一个全局的配置文件application.properties或者是application.yml,放在在src/main/recesources下或者在类路径下的/config下. springboot不仅仅支持常规的properties文件而且支持yaml语言的配置文件,yaml是以数据为中心的语言,在配置数据的时候更具有OOP的特征. springboot的application配置文件的作用是对一些默认配置值进行修改. 比如修改端口号,项目访问名称 .yml配置

Springboot中使用缓存

在开发中,如果相同的查询条件去频繁查询数据库, 是不是会给数据库带来很大的压力呢?因此,我们需要对查询出来的数据进行缓存,这样客户端只需要从数据库查询一次数据,然后会放入缓存中,以后再次查询时可以从缓存中读取.Spring3开始提供了强大的基于注解的缓存支持,可以通过注解配置方式低侵入的给原有Spring应用增加缓存功能,提高数据访问性能. 具体在Springboot中使用缓存如下: 1.在pom.xml中引入cache依赖,添加如下内容: <dependency> <groupId&g