一、SpringBoot的yml配置文件
二、SpringBoot配置文件优先级
三、Profile-specific配置文件
SpringBoot版本:1.5.13.RELEASE
对应官方文档链接:https://docs.spring.io/spring-boot/docs/1.5.13.RELEASE/reference/htmlsingle/
上一篇:SpringBoot 入门篇(四) SpringBoot外部配置以及优先级
一、SpringBoot的yml配置文件
SpringBoot的配置文件常用的有2种类型,.properties和.yml。默认情况下,SpringBoot会加载classpath或者classpath:/config下的application.properties或者application.yml文件。
.properties文件是我们常用的配置文件,.yml则是YAML文件,YAML是一种易阅读、易和脚本语言交互的用来表达资料序列的编程语言,这里简单说下语法
(1)使用空格 Space 缩进分层,同层元素左对齐,不同层元素使用不同的空格数目缩进(不能使用 Tab,各系统 Tab对应的空格数目可能不同,导致层次混乱);
(2)#表示注释;
(3)破折号后面跟一个空格表示列表;
(4)key和value之间用冒号和空格分隔。
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
#yaml 的list集合
my:
servers:
- dev.bar.com
- foo.bar.com
上述代码段是一个标准的yml文件内容,等价于如下properties配置
environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
SpringBoot通过YamlPropertiesFactoryBean 来加载application.yml文件,并通过YamlMapFactoryBean 将其转换成Map。
我们可以通过@Value或者@ConfigurationProperties注解来获取配置文件中的数据。例如有如下application.yml文件:
name:
nameStr
age:
11
#yaml 的list集合
my:
servers:
- dev.bar.com
- foo.bar.com
@Configuration
public class MyConfiguration {
// 通过@Value获取值
@Value("${name}")
private String name;
@Value("${age}")
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;
}
}
@Configuration
//通过@ConfigurationProperties获取值
@ConfigurationProperties(prefix="my")
public class MyConfig {
private List<String> servers = new ArrayList<String>();
public List<String> getServers() {
return this.servers;
}
}
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.run(args);
}
@Autowired
private MyConfiguration myConfiguration;
@RequestMapping("/getMyConfiguration")
public String getMyConfiguration() {
return myConfiguration.getName() + ":" + myConfiguration.getAge();
}
@Autowired
private MyConfig myConfig;
@RequestMapping("/getMyConfig")
public List<String> getMyConfig() {
return myConfig.getServers();
}
}
启动Application,在浏览器分别输入 http://localhost:8080/getMyConfiguration 和 http://localhost:8080/getMyConfig 可以得到配置的值。
当使用@ConfigurationProperties获取配置值,SpringBoot还提供了一种宽松的绑定方式(@Value不支持该特性):
@ConfigurationProperties(prefix="person")
public class OwnerProperties {
private String firstName;
public String getFirstName() {
return this.firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
}
则在配置文件中使用如下任意一种方式都能获取对应的配置值
person.firstName
person.first-name
person.first_name
PERSON_FIRST_NAME
二、SpringBoot配置文件优先级
默认情况下,SpringBoot会加载如下位置的配置文件,这些文件可以同时存在,当这些文件中的多个存在相同的key时,value的优先级从高到低分别为:
(1)当前应用目录下/config子文件夹下的application.properties或者application.yml文件;
(2)当前应用目录下的application.properties或者application.yml文件;
(3)类路径下/config子文件夹下的application.properties或者application.yml文件;
(4)类路径下的application.properties或者application.yml文件。
如果想指定加载的配置文件,则可以通过在启动时添加命令行参数--spring.config.name或者--spring.config.location进行指定文件。
$ java -jar app.jar --spring.config.name=myproject
或者
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
需要注意的是,使用命令行参数指定的文件的优先级是最高的,例如如果通过命令行指定了应用目录下./custom-config/和classpath:/custom-config/,则value的优先级从高到低分别为:
(3)当前应用目录下./custom-config路径下的application.properties或者application.yml文件;
(4)类路径下子文件夹/custom-config/下的application.properties或者application.yml文件;
(3)当前应用目录下/config子文件夹下的application.properties或者application.yml文件;
(4)当前应用目录下的application.properties或者application.yml文件;
(5)类路径下/config子文件夹下的application.properties或者application.yml文件;
(6)类路径下的application.properties或者application.yml文件。
三、Profile-specific配置文件
SpringBoot除了会加载application.properties/yml外,还会加载application-{profile}.properties/yml,其中{profile}默认为default,也就是说,如果同时存在application.properties/yml和application-default.properties/yml,SpringBoot会同时加载它们,且application-default.properties/yml的优先级更高。
我们也可以自定义{profile},需要注意,除了application-default.properties/yml外,application-{profile}.properties/yml文件在加载后会处于未激活状态,即其中的值无法使用,如果想使用,则需要在application.properties/yml中指定spring.profiles.active。
例如,在工程中有如下3个文件,application-dev.yml表示开发使用的配置,application-test.yml表示测试使用的配置,application-pro.yml表示生产环境使用的配置,则我们通过在application.yml中指定spring.profiles.active的值为{profile}对应的值(即dev\test\pro),就可以灵活的修改对应配置,方便开发、测试和运维的同学使用不同的配置。
spring:
profiles:
active:
pro
另外一种激活application-{profile}.properties/yml文件的方式是使用SpringApplication.setAdditionalProfiles()方法:
public static void main(String[] args) {
SpringApplication application = new SpringApplication(Application.class);
application.setAdditionalProfiles("dev");
application.run(args);
}