Springboot配置文件优先级/顺序
Springboot项目一键启动,所有相关的配置都放置在配置文件中实现自动装载功能。Springboot启动时将会读取这些配置文件,那么这些配置文件的优先级/顺序是如何呢?
总览图
1.命令行参数
启动java程序时,通过-- 双减号声明,后面直接配置属性=值 即可。
java -jar spring-demo-SNAPSHOT.jar --server.port=8001
2. java:comp/env 的 JNDI 属性
很少见,有兴趣可以去了解下,其实就是Tomcat连接池中的配置
"Java:comp/env/"讲解与JNDI
3.系统属性
可以在java中获取系统属性
System.getProperties();
4.系统环境变量
开发者应该都了解,Windows或是Linux系统中都有环境变量这一概念,以及它的存放位置等。
5.外部副properties/yml文件
JAR包外部的application-XXX.properties或application-XXX.yml配置文件,启动java程序时可以指定外部配置文件
java -jar xxx.jar --spring.config.location=/opt/config/application-dev.yml
6.内部副properties/yml文件
JAR包内部的application-XXX.properties或application-XXX.yml配置文件
7.外部主properties/yml文件
JAR包外部的application.properties或application.yml配置文件;指定文件或目录都行
java -jar xxx.jar --spring.config.location=/opt/config/application.yml
java -jar xxx.jar --spring.config.location=/opt/config/
8.内部主properties/yml
JAR包内部的application.properties或application.yml配置文件
9.@PropertySource指定的文件
@Configuration注解类上的@PropertySource指定的配置文件,一般可以在项目中设置一个配置文件,可以通过@Configuration和@PropertySource来加载一些配置文件。
比如有个user.properties 文件
username=zj
password=1234
配置一个类来接口
@Data
public class User {
private String username;
private String password;
}
@Configuration
@PropertySource(value = {"classpath:user.properties"}, encoding = "utf-8")
public class UserProperties {
@Bean
@ConfigurationProperties
public User user() {
return new User();
}
}
扩展贴士:
在一些注解中,可以使用${} 表达式来获取配置文件中的一些配置,如:
可以匹配具体环境下的其他配置文件
@PropertySource("classpath:/application-${spring.profiles.active}.properties")
@Configuration
public class LoadProperties {
}
总结
在项目内部中:
但是大多数情况下,我们在微服务架构中,可能bootstrap 文件用的会多一些,在 Spring Boot 中有两种上下文,一种是 bootstrap另外一种是 application, bootstrap 是应用程序的父上下文,bootstrap用于应用程序上下文的引导阶段,由父Spring ApplicationContext加载。bootstrap 的加载优先于 applicaton,所以优先级从大到小如下: bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml
从项目内外部情况来分优先级:
项目外部配置文件 > 项目内部配置文件!!!
多环境配置方式
当项目中需要区分多环境时:
-
文件的命名多是application-{profile}.properties/yml 或者是bootstrap-{profile}.properties/yml 文件。 -
或者我们可以在一个配置文件中进行多环境区分,通过--- 三中划线区分,看项目具体情况吧,两种方法都了解下。 spring:
profiles:
active: dev
---
server:
port: 8083
spring:
profiles: dev
---
server:
port: 8084
spring:
profiles: prod
激活指定的profile时:
-
可以在主配置文件中指定spring.profiles.active=环境 -
可以在命令行中 java -jar spring-demo-SNAPSHOT.jar --spring.profiles.active=dev
-
可以设置虚拟机参数 -Dspring.profiles.active=dev
参考文档
|