SpringBoot配置文件详解
文章目录
- 一、配置文件分类
- 1.1 使用
- 1.2 优先级
- 二、YAML
- 2.1 对比
- 2.2 基本语法
- 2.3 数据格式
- 2.3.1 对象
- 2.3.2数组
- 2.3.3 纯量
- 2.3.4 参数引用
- 2.4 小结
- 三、读取配置文件
- 3.1 @Value
- 3.2 Environment
- 3.3 @ConfigurationProperties
- 四、Profile
- 4.1 配置方式
- 4.1.1 多profile文件方式
- 4.1.2 yml多文档形式
- 4.2 激活方式
- 4.2.1 配置文件
- 4.2.2 虚拟机参数
- 4.2.3 命令行参数
- 4.3 小结
- 五、内外部配置文件加载顺序
- 5.1 内部配置文件加载顺序
- 5.2 外部配置文件加载顺序
一、配置文件分类
SpringBoot
是基于约定的,所以很多配置都有默认值,但如果想使用自定义配置替换默认配置的话,可以使用application.properties
或application.yml/.yaml
进行配置,其中,默认配置文件名称为application
。
1.1 使用
以配置server port
为例:
properties
:server.port=8080
yml/yaml
:server:
port: 8080
1.2 优先级
在同一级目录下,优先级为:properties > yml > yaml
二、YAML
YAML
全称是 YAML Ain't Markup Language
。YAML
是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML
库的不同的编程语言程序导入,比如: C/C++
, Ruby
, Python
, Java
, Perl
, C#
, PHP
等。YML
文件是以数据为核心的,比传统的xml方式更加简洁。
YAML
文件的扩展名可以使用.yml
或者.yaml
。
2.1 对比
如下为properties
、xml
和yml
的对比:
properties
:
server.port=8080
server.address=127.0.0.1
xml
:
<server>
<port>8080</port>
<address>127.0.0.1</address>
</server>
yml
:
server:
port: 8080
address: 127.0.0.1
对比来看,yml
以数据为核心,更加简洁,层次关系清晰
2.2 基本语法
- 大小写敏感
- 数据值前边必须有空格,作为分隔符
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)。
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
#
表示注释,从这个字符一直到行尾,都会被解析器忽略。
eg.
server:
port: 8080
address: 127.0.0.1 name: abc
2.3 数据格式
2.3.1 对象
对象(map),键值对的集合,格式如下:
person:
name: zhangsan
# 行内写法
person: { name: zhangsan}
2.3.2数组
一组按次序排列的值,格式如下:
address:
- beijing
- shanghai
# 行内写法
address: [beijing,shanghai]
2.3.3 纯量
单个的、不可再分的值,格式如下:
msg1: 'hello \n world' # 单引忽略转义字符
msg2: "hello \n world" # 双引识别转义字符
2.3.4 参数引用
除声明时直接赋值外,还可使用参数引用方式,如下:
name: lisi
person:
name: ${name} # 引用上边定义的name值
2.4 小结
配置文件类型
properties
:和以前一样yml/yaml:
注意空格,yaml:简洁,以数据为核心
基本语法
- 大小写敏感
- 数据值前边必须有空格,作为分隔符
- 使用空格缩进表示层级关系,相同缩进表示同一级
数据格式
- 对象
- 数组: 使用 “- ”表示数组每个元素
- 纯量
参数引用
${key}
三、读取配置文件
在application.yml
中,配置如下:
company: 微软
msg: 'hello \n world'
msg2: "hello \n world"
# 对象
person:
name: 旺财
age: 12
books: [三国演义,'水浒传']
# 数组
student: {name: 小强, age: 8}
hobbies:
- 抽烟
- 喝酒
- 烫头
server:
port: 8080
3.1 @Value
获取并打印信息,如下:
@Value("${company}")
private String company;
@Value("${hobbies[0]}")
private String hobby;
@Value("${msg}")
private String msg1;
@Value("${msg2}")
private String msg2;
System.out.println("------------通过@Value获取配置信息-------------");
System.out.println(company);
System.out.println(hobby);
System.out.println(msg1);
System.out.println(msg2);
输出结果为:
------------通过@Value获取配置信息-------------
微软
抽烟
hello \n world
hello
world
3.2 Environment
通过环境信息获取,如下:
@Autowired
private Environment env;
System.out.println("------------通过Environment获取配置信息-------------");
System.out.println(env.getProperty("company"));
System.out.println(env.getProperty("person.age"));
输出结果如下:
------------通过Environment获取配置信息-------------
微软
12
3.3 @ConfigurationProperties
可以通过@ConfigurationProperties
注解完成对象信息获取,新建Person
类,如下:
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private int age;
private String[] books;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String[] getBooks() {
return books;
}
public void setBooks(String[] books) {
this.books = books;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", books=" + Arrays.toString(books) +
'}';
}
}
调用如下:
@Autowired
private Person person;
System.out.println(env.getProperty("person.age"));
System.out.println("------------通过@ConfigurationProperties获取配置信息-------------");
输出结果为:
------------通过@ConfigurationProperties获取配置信息-------------
Person{name='旺财', age=12, books=[三国演义, 水浒传]}
四、Profile
在开发SpringBoot
应用时,通常同一套程序会被安装到不同环境,比如开发、测试、生产等。其中数据库地址、服务 器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。
profile
功能就是来进行动态配置切换的。
4.1 配置方式
4.1.1 多profile文件方式
新建application-dev.properties
、application-pro.properties
分别表示开发和生产环境,内容只对server.port
做不同配置,代码如下:
application-dev.properties
:
server.port=8081
application-pro.properties
:
server.port=8082
在application.properties
中标记active
,如下:
spring.profiles.active=pro
此时,直接运行,如图:
启动日志:
The following profiles are active: pro
Tomcat started on port(s): 8082 (http) with context path ''
这样就完成生产环境的配置,同理开发环境也是如此。
4.1.2 yml多文档形式
在application.yml
文件中,通过---
做文档片断间隔,分别声明dev
和prod
环境,如下:
---
server:
port: 8081
spring:
profiles: dev
---
server:
port: 8082
spring:
profiles: pro
---
同样,通过spring.profiles.active
进行环境指定,如下:
spring:
profiles:
active: dev
同样可以完成不同环境的切换
4.2 激活方式
4.2.1 配置文件
上述方法都是通过在配置文件中spring.profile.active
进行指定来完成不同环境的激活,此处不再赘述。
4.2.2 虚拟机参数
在IDEA
中EdifConfigurations
中,配置虚拟机参数,如下:
此时,再次启动就按照我们新配置的方式进行环境选择了。
4.2.3 命令行参数
如果打出jar
包,通过命令行运行的话,可以通过命令行参数来启动,如下:java–jarxxx.jar --spring.profiles.active=dev
4.3 小结
profile
是用来完成不同环境下,配置动态切换功能的profile
配置方式多
profile
文件方式:提供多个配置文件,每个代表一种环境application-dev.properties/yml
开发环境application-pro.properties/yml
生产环境application-test.properties/yml
测试环境
yml
多文档方式:- 在
yml
中使用 — 分隔不同配置
- 在
profile
激活方式- 配置文件: 再配置文件中配置
spring.profiles.active=dev
- 虚拟机参数:在
VM options
指定-Dspring.profiles.active=dev
- 命令行参数:
java–jarxxx.jar --spring.profiles.active=dev
- 配置文件: 再配置文件中配置
五、内外部配置文件加载顺序
5.1 内部配置文件加载顺序
在通过IDEA
启动Springboot
程序时,会从以下位置加载配置文件:
file:./config/
:当前项目下的/config
目录下file:./
:当前项目的根目录classpath:/config/
:classpath
的/config
目录classpath
:classpath
的根目录
加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,高优先级的内容会覆盖底优先级的内容,形成互补配置。
需要注意的是在工程根目录下或者根目录的config
下面的配置文件,在工程打包时候不会被打包进去。
5.2 外部配置文件加载顺序
通过java -jar
启动时:
- 通过指定配置
spring.config.location
来改变默认配置,一般在项目已经打包后,我们可以通过指令java -jar xxxx.jar --spring.config.location=/Users/xxx/Projects/application.yml
来加载外部的配置 - 命令行参数:
java -jar xxx.jar --server.port=8082 --server.servlet.context-path=/hi
当然,也可以在jar
包所在目录下新建applicaion.properties
或config/application.properties
文件,通过java -jar xxx.jar
启动,此时加载顺序同内部配置文件,比如根目录下的application.propertie/yml
会比jar
内部的application.propertie/yml
优先级要高
外部文件属性加载配置点击前往官方介绍
还没有评论,来说两句吧...