一、命令行参数(最高优先级)
通过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加载的所有配置源及其顺序。