一、命令行参数(最高优先级)
通过java -jar启动应用时传入的参数,例如:
java -jar app.jar --server.port=8081 --spring.datasource.url=jdbc:mysql://new-host:3306/db这些参数会覆盖所有其他配置源中的相同配置。
二、JNDI属性(仅适用于Servlet容器)
部署在Servlet容器(如Tomcat)中的应用,可以通过JNDI(Java Naming and Directory Interface)获取服务器配置的环境变量,例如:
<!-- Tomcat context.xml -->
<Environment name="spring.datasource.url" value="jdbc:mysql://jndi-host:3306/db" type="java.lang.String" />三、Java系统属性(System.getProperties())
通过-D参数设置的JVM系统属性,例如:
java -Dserver.port=8082 -jar app.jar代码中可通过System.setProperty("key", "value")设置,会覆盖后续配置源。
四、操作系统环境变量
例如在Linux/Mac中通过export命令设置:
export SERVER_PORT=8083
java -jar app.jar或在Windows中通过set命令设置。
注意:Spring会自动将环境变量名中的_转换为.(如SPRING_DATASOURCE_URL → spring.datasource.url)。
五、RandomValuePropertySource(仅生成随机值)
特殊配置源,用于生成随机值(如${random.int}),不覆盖其他配置项。
六、应用外部的配置文件
按以下顺序加载(优先级递减):
file:./config/目录下的配置文件
例如:./config/application.yml或./config/application.properties。file:./目录下的配置文件
例如:./application.yml或./application.properties。
七、应用内部的配置文件
按以下顺序加载(优先级递减):
classpath:/config/目录下的配置文件
例如:src/main/resources/config/application.yml。classpath:/目录下的配置文件
例如:src/main/resources/application.yml。
八、@PropertySource注解指定的配置文件
在@Configuration类中通过@PropertySource注解引入的配置文件:
@Configuration
@PropertySource("classpath:custom.properties")
public class AppConfig {
// ...
}这些配置文件的优先级低于application.yml/properties。
九、默认配置(最低优先级)
通过@ConfigurationProperties或@Value注解设置的默认值,例如:
@ConfigurationProperties(prefix = "myapp")
public class MyAppProperties {
private String name = "defaultName"; // 默认值
// getter/setter
}十、特定环境配置文件的覆盖规则
针对不同环境(如dev、prod)的配置文件(如application-dev.yml),其优先级规则相同,但仅在激活对应环境时生效。例如:
- 命令行参数指定的环境配置(如
--spring.profiles.active=dev)优先级最高。 - 环境变量指定的环境配置(如
SPRING_PROFILES_ACTIVE=dev)次之。 - 配置文件中通过
spring.profiles.active指定的环境配置优先级最低。
总结
优先级顺序简化为:
命令行参数 > JNDI > 系统属性 > 环境变量 > 外部配置文件 > 内部配置文件 > @PropertySource > 默认配置
最佳实践
- 敏感信息(如数据库密码):通过环境变量或命令行参数配置,避免硬编码在配置文件中。
- 开发环境配置:使用
application-dev.yml,并通过@Profile注解区分环境。 - 生产环境配置:优先使用外部配置文件(如
./config/application.yml)或容器环境变量。 - 调试配置优先级:启动应用时添加
--debug参数,查看Spring加载的所有配置源及其顺序。
1 条评论
新车新盘 嘎嘎稳 嘎嘎靠谱