配置文件分类
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用 application.properties或者application.yml (application.yaml) 进行配置。
优先级:properties > yml > yamls
注意当高优先级文件存在的属性,低优先级文件里面相同的属性不会生效
yaml
基本介绍
YAML全称是 YAML Ain't Markup Language。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅 读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如:C/C++,Ruby. Python, Java, Perl, C#, PHP 等。YML文件是以数据为核心的,比传统的xml方式更加简洁。 YAML文件的扩展名可以使用yml或者yaml。以数据为核心
yaml基本语法
• 大小写敏感
• 数据值前边必须有空格,作为分隔符
• 使用缩进表示层级关系
• 缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混乱)。
• 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
• # 表示注释,从这个字符一直到行尾,都会被解析器忽略。
yaml数据格式
- 对象(map):键值对的集合
person:
name: zhangsan
# 行内写法
person: {name: zhangsan}
- 数组:一组按次序排列的值
address:
-shanghai
-shanghai
#行内写法
address: [beijing,shanghai]
- 纯量:单个的不可再分的值
msg1:'hello \n world' #单引忽略转义字符
msg2:"hello \n world" #双引识别转义字符
读取配置文件内容
yml 文件内容
server:
port: 8081
name: zhangsan
person:
name: ${name}
address:
- beijing
- shanghai
1. @Value
@Value
注解可以用于将配置文件中的属性值注入到 Spring Bean 中。你可以在需要读取配置属性的地方直接使用@Value
注解,并指定属性的键值,Spring Boot 会自动将配置文件中对应键的值注入到该属性中。例如:
//在 controller 层使用注解读取配置文件
//读取单个值
@Value("${name}")
private String name;
//读取对象中的值
@Value("${person.name}")
private String name1;
//读取数组中的值
@Value("${address[1]}")
private String address;
在上面的示例中,${name}
是配置文件中的属性键,Spring Boot 会自动将其对应的值注入到 name
属性中。
2. Environment
因为@Value 一次只能读取一个值,所以当我们要读取的配置文件数据多了就可以用我们的 Environment
通过Environment
对象直接访问配置属性。Spring Boot 将配置文件中的属性值加载到Environment
中,你可以通过Environment
对象的方法来获取这些属性值。例如:
@Autowired
private Environment env;
//方法中使用 env.getProperty 获取对应的字段值
System.out.println(env.getProperty("person.name"));
3. @ConfigurationProperties
@ConfigurationProperties
注解可以用于将配置文件中的属性值映射到一个 JavaBean 中。你可以创建一个 JavaBean 类,其中的属性与配置文件中的属性一一对应,然后使用@ConfigurationProperties
注解标记该类,并指定配置文件中的前缀。Spring Boot 会自动将配置文件中以指定前缀开头的属性值注入到该 JavaBean 对象中。例如:
创建一个 javaBean
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "person{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
在 controller 中使用该 javaBean
@Autowired
private Person person;
System.out.println(person);
profile
我们在开发SpringBoot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务 器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
profile配置方式
1️. 多profile文件方式
application.yml
#当在原文件定义active时就会读取对应配置文件
spring:
profiles:
active: pro
application-dev.yml
server:
port: 8081
application-test.yml
server:
port: 8082
application-pro.yml
server:
port: 8083
2. yml 多文档方式
SpringBoot旧版使用
---
server:
port: 8083
spring:
profiles: pro
---
spring:
profiles:
active: pro
SpringBoot 新版使用
---
server:
port: 8081
spring:
config:
activate:
on-profile: dev
---
server:
port: 8082
spring:
config:
activate:
on-profile: test
---
server:
port: 8083
spring:
config:
activate:
on-profile: pro
---
spring:
profiles:
active: pro
profile激活方式
配置文件方式
配置文件中配置:spring.profiles.active=dev
虚拟机参数
VM options
命令行参数
Program arguments
通过外部参数的方式动态激活配置
- 通过 maven 插件,package 打包 SpringBoot 项目
- 在终端中使用java -jar 'jar包路径'
内部配置加载顺序
Springboot程序启动时,会从以下位置加载配置文件:
- file:/config/:当前项目下的/config目录下
- file:/ :当前项目的根目录
- classpath:/config/: classpath的/config目录
- classpath:/ :classpath的根目录 (这里的 classpath 其实就是 resource 编译后的路径)
加载顺序为上文的排列顺序,高优先级配置的属性会生效
外部配置加载顺序
和 SpringBoot jar包平级配置文件
当有一个配置文件和 jar 包在同级目录下时,会自动加载该配置文件的配置信息
在命令行直接指定配置参数
java -jar ./demo-0.0.1-SNAPSHOT.jar --server.port=8084 --server.servlet.context-path=/haha
指定外部配置文件
java -jar ./demo-0.0.1-SNAPSHOT.jar --spring.config.location=/Users/hxy/code/java/IdeaProjects/config/application.yml