Spring Boot - 配置文件详解
在Spring Boot的配置文件中,有两种后缀的配置文件,分别是.properties文件和.yml文件。Spring Boot 提供了对应用进行自动化配置。相比以前 XML 的配置方式,很多显式方式申明是不需要的。大多数默认的配置足够实现开发功能,从而更快速开发。
Spring Boot - 配置文件类型:
SpringBoot使用一个全局的配置文件,且配置文件名是固定的;
- *.properties属性文件;属于最常见的一种;
- *.yml是yaml格式的文件,yaml是一种非常简洁的标记语言。
.properties文件配置:
示例代码:
blog.config.title="柒索"
blog.config.subtitle="一个头脑聪明,五肢发达的男人。"
blog.config.url="http://object.ws"
blog.config.number=4000
.yml文件配置:
示例代码:
blog:
config:
title: 柒索
subtitle: 一个头脑聪明,五肢发达的男人。
url: http://object.ws
number: ${random.int}
可以看出两种配置文件的写法yaml 文件的方式更简洁一些,所以推荐使用 yaml 文件来作为 Spring Boot 的配置文件。
Spring Boot - yml语法:
基本语法
k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的
server:
port: 8081
path: /hello
属性和值也是大小写敏感;
值的写法
字面量:
普通的值(数字,字符串,布尔)
k: v:字面直接来写;
字符串默认不用加上单引号或者双引号;
“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思
name: “zhangsan \n lisi”:输出;zhangsan 换行 lisi
‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: ‘zhangsan \n lisi’:输出;zhangsan \n lisi
对象、Map、K:V:
k: v:在下一行来写对象的属性和值的关系;注意缩进
对象还是k: v的方式
blog:
title: 柒索
age: 2
行内写法:
info: {url: object.ws,subtitle: .......}
数组(List、Set):
用- 值表示数组中的一个元素
tags:
- java
- go
- node
行内写法
pets: [cat,dog,pig]
##Spring Boot 配置文件注入:
注入示例代码:
配置文件代码:
blog:
title: 柒索
age: 2
isdynamic: false
createdate: 2016/01/01
tags:
- java
- go
- node
info:
url: object.ws
subtitle: 一个头脑聪明,五肢发达的男人
与之对应的JavaBean:
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;
* prefix = "blog":配置文件中哪个下面的所有属性进行一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
*
*/
@Component
@ConfigurationProperties(prefix = "blog")
public class Blog {
private String title;
private Integer age;
private Boolean isdynamic;
private Date createdate;
private Map<String,Object> tags;
private List<Object> lists;
private Info info;
我们可以导入配置文件处理器,以后编写配置就有提示了:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
@Value和@ConfigurationProperties对比
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
配置文件yml还是properties他们都能获取到值;
如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;
配置文件注入值数据校验
@Component
@ConfigurationProperties(prefix = "blog")
@Validated
public class Blog {
/**
* <bean class="Blog">
* <property name="title" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
* <bean/>
*/
//title必须是邮箱格式
@Email
private String title;
private Integer age;
private Boolean isdynamic;
private Date createdate;
private Map<String,Object> tags;
private List<Object> lists;
private Info info;
Spring Boot - 配置文件占位符:
在配置文件中使用随机数:
Spring Boot的属性配置文件中可以通过${random}
来产生int值、long值或者string字符串,来支持属性的随机值。
示例代码:
blog:
config:
url: "http://object.ws"
strval: ${random.value} # 产生随机字符串
number: ${random.int} # 产生随机Int类型数值
longnum: ${random.long} # 产生随机 Long类型数值
test1: ${random.int[10]} # 产生10以内的的随机数
test2: ${random.int[10,30]} # 产生10-30之间的随机数
refval: ${blog.config.url}and${blog.config.strval} # 参数之间的互相引用
自定义配置项代码演示:
Spring Boot 为我们提供了许多默认的配置项,但是在开发的过程中,总是会有一些业务需要我们自定义配置,如下代码演示如何使用自定义配置:
示例代码:application.yml
blog:
config:
title: "柒索"
subtitle: "一个头脑聪明,五肢发达的男人"
url: "http://object.ws"
number: ${random.int}
示例代码:BlogController.java
package ws.object.springboot.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class BlogController {
@Value("${blog.config.title}")
String Title;
@Value("${blog.config.subtitle}")
String subTitle;
@Value("${blog.config.url}")
String Url;
@Value("${blog.config.number}")
int Number;
@RequestMapping(value = "/blog")
public String Blog(){
return " Title:"+Title+
" subTitle:"+subTitle+
" URL:"+Url+
" Number:"+Number;
}
}
之后在浏览器输入http://localhost:8080/blog
就能看到配置在 .yml
文件中的值已经显示在页面里了。
Spring Boot - 多环境配置:
在现实的开发环境中,我们需要不同的配置环境,在不同环境下可以配置不同的参数文件,便于部署,提高效率减少出错率,常见配置格式为application-{profile}.properties,其中{profile}对应你的环境标识,比如:dev(开发环境)、test(测试环境)、vis(演示环境)、prod(生产环境)。
- application-test.yml:测试环境
- application-dev.yml:开发环境
- application-prod.yml:生产环境
yml多文档块方式:
spring:
profiles:
active: prod #指定使用哪个环境
server:
port: 8081
---
server:
port: 8083
---
server:
port: 8084
激活指定配置:
配置文件中指定:
如何使用?我们只需要在application.yml文件中加上:
spring:
profiles:
active: test
启动Spring Boot 应用是就会使用application-tst.yml
配置文件 或者是属于application.yml
中test代码块中的内容。
命令行指定:
在通过命令行启动程序的时候,可以追加启动参数:
java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
虚拟机参数:
在IDEA中启动项目的时候在配置中加入虚拟机启动参数:
-Dspring.profiles.active=dev
Spring Boot - 文件加载位置和顺序:
配置文件加载位置:
springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:
- file:./config/
- file:./
- classpath:/config/
- classpath:/
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;
我们还可以通过spring.config.location来改变默认的配置文件位置
项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.config.location=~/desktop/application.properties
配置文件加载顺序:
把所有配置全都打在一个jar包里,显然不是最好的做法,更常见的做法是把配置文件放在jar包外面,可以在需要时,不动java代码的前提下修改配置,spring-boot会按以下顺序加载配置文件 application.properties或application.yml, 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置:
所有的配置都可以在命令行上进行指定
java -jar demo.jar --server.port=8087
多配置项使用空格分开来自java:comp/env的JNDI属性
Java系统属性(System.getProperties())
操作系统环境变量
RandomValuePropertySource配置的random.*属性值
jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
jar包外部的application.properties或application.yml(不带spring.profile)配置文件
jar包内部的application.properties或application.yml(不带spring.profile)配置文件
@Configuration注解类上的@PropertySource
通过SpringApplication.setDefaultProperties指定的默认属性
总结:
- 先查找jar文件同级目录下的 ./config 子目录 有无配置文件 (外置)
- 再查找jar同级目录 有无配置文件(外置)
- 再查找config这个package下有无配置文件(内置)
- 最后才是查找classpath 下有无配置文件(内置)