一、配置文件
SpringBoot使用一个全局的配置文件,配置文件名是固定的
- application.properties
- application.yml
配置文件的作用:修改Spring Boot自动配置的默认值;Spring Boot在底层都给我们自动配置好;不满意可以修改
YAML ( YAML Ain't a Markup Language)
YAML A Markup Language :是一种标记语言;
YAML isn't a Markup Language :不是一种标记语言;
标记语言:
以前的配置文件;大多都使用 xxx.xml 文件
YAML :以数据为中心,比json、xml等更适合做配置文件;
YAML配置实例
server: port:8081
XML
<server> <port>8081</port> </server>
二、YAML语法
1、基本语法
k:(空格)v :表示一对键值对(空格必须有)
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#'表示注释
server:
port: 8081
path: /hello
2、值的写法
(1)、字面量,纯量是最基本的,不可再分的值
k: v:字面直接来写;
" ":双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: "zhangsan lisi" ;输出:zhangsan 换行 lisi
' ' :单引号;会转义字符串里面的特殊字符;特殊字符最终只是个普通的字符串数据
name: 'zhangsan lisi' ;输出:zhangsan lisi
包括:
- 字符串
- 布尔值
- 整数
- 浮点数
- Null
- 时间
- 日期
使用一个例子来快速了解纯量的基本使用:
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
(2)、对象(属性和值)(键值对)
对象键值对使用冒号结构表示 key: value,冒号后面要加一个空格。
也可以使用 key:{key1: value1, key2: value2, ...}。
还可以使用缩进表示层级关系;
key:
child-key: value
child-key2: value2
较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value:
?
- complexkey1
- complexkey2
:
- complexvalue1
- complexvalue2
意思即对象的属性是一个数组 [complexkey1,complexkey2],对应的值也是一个数组 [complexvalue1,complexvalue2]
(3)、数组(list.、set)
以 - 开头的行表示构成一个数组:
- A
- B
- C
YAML 支持多维数组,可以使用行内表示:
key: [value1, value2, ...]
一个相对复杂的例子:
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W
意思是 companies 属性是一个数组,每一个数组元素又是由 id、name、price 三个属性构成。
数组也可以使用流式(flow)的方式表示:
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
三、配置文件注入
配置文件
person:
lastname: zhangsan
age: 18
boss: false
birth: 2017/12/12
maps: {"k1":v1,"k2":v2}
lists:
- lisi
- wangwu
dog:
name: 小狗
age: 2
javabean
** * 将配置文件中配置的每一个属性值,映射到这个组件中 * @ConfigurationProperties:告诉Spring Boot将本类中的所有属性和配置文件中相关的配置进行绑定; * prefix = "person" :配置文件中哪个下面的属性进行一一映射 * * @Component :只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能 */ @Component @ConfigurationProperties(prefix = "person") public class Person { private String lastname; private Integer age; private Boolean boss; private Date birth; private Map<String,Object> maps; private List<Object> lists; private Dog dog;
可以导入配置文件处理器,以后编写配置就有提示了
<!--导入配置文件处理器,配置文件进行绑定就会有提示--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
1、@Value获取值和@ConfigurationProperties获取值比较
ConfigurationProperties | @Value | |
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 |
支持 |
JSR303数据检验 | 支持 |
不支持 |
复杂类型封装 | 支持 |
不支持 |
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个JavaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties(@ConfigurationProperties默认在全局文件中获取值);
2、Properties配置文件编码问题
3、配置文件注入值数据检验
/** * 将配置文件中配置的每一个属性值,映射到这个组件中 * @ConfigurationProperties:告诉Spring Boot将本类中的所有属性和配置文件中相关的配置进行绑定; * prefix = "person" :配置文件中哪个下面的属性进行一一映射 * * @Component :只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能 */ @Component @ConfigurationProperties(prefix = "person") @Validated //验证注解 public class Person { /** * @Value注解的作用跟bean一样 * <bean class="Person"> * <property name="lastname" value="字面量/${key}从环境配置、配置文件中获取值/#{SpEL}"></property> * ></bean> */ //LatName必须是邮箱格式 @Email // @Value("${person.lastname}") private String lastname; // @Value("#{11*2}") private Integer age; // @Value("true") private Boolean boss; private Date birth;
4、@PropertySource && @ImportResource
@PropertySource:加载指定的配置文件
/** * 将配置文件中配置的每一个属性值,映射到这个组件中 * @ConfigurationProperties:告诉Spring Boot将本类中的所有属性和配置文件中相关的配置进行绑定; * prefix = "person" :配置文件中哪个下面的属性进行一一映射 * * @Component :只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能 */ @PropertySource(value = {"classpath:person.properties"}) @Component @ConfigurationProperties(prefix = "person") @Validated public class Person { /** * @Value注解的作用跟bean一样 * <bean class="Person"> * <property name="lastname" value="字面量/${key}从环境配置、配置文件中获取值/#{SpEL}"></property> * ></bean> */ //LatName必须是邮箱格式 // @Email // @Value("${person.lastname}") private String lastname; // @Value("#{11*2}") private Integer age; // @Value("true") private Boolean boss; private Date birth;
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;
SpringBoot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;
想让Spring的配置文件生效,加载起来;@ImportResoure标注在一个配置类上
@ImportResource(locations = {"classpath:beans.xml"})
导入Spring的配置文件让其生效
现在不来编写Spring配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
SpringBoot推荐给容器中添加组件的方式:推荐使用全注解的方式
1、配置类(现在) ===== Spring的配置文件(之前)
2、使用@Bean给容器中添加组件
四、配置文件的占位符
person.lastname=张三${random.value} person.age=${random.int} person.birth=2017/12/12 person.boss=false person.maps.k1=v1 person.maps.k2=v2 person.lists=a,b,c person.dog.name=${person.lastname}_dog person.dog.age=2
五、Profile
Profile是spring对不同环境提供不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
1、多profile文件
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml;
默认使用application.properties
2、yml支持多文档块方式
server:
port: 8081
spring:
profiles:
active: dev
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: prod
3、激活指定profile
(1)在配置文件中指定 spring.profiles.active=dev
(2)用命令行的方式启动
--spring.profiles.active=dev
第一种方式 可以在测试的时候,配置传入命令行参数
第二种方式 java -jar springboot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=prod
(3)虚拟机参数
-Dspring.profiles.active=dev