一、命令行参数(最高优先级)

通过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_URLspring.datasource.url)。

五、RandomValuePropertySource(仅生成随机值)

特殊配置源,用于生成随机值(如${random.int}),不覆盖其他配置项。

六、应用外部的配置文件

按以下顺序加载(优先级递减):

  1. file:./config/目录下的配置文件
    例如:./config/application.yml./config/application.properties
  2. file:./目录下的配置文件
    例如:./application.yml./application.properties

七、应用内部的配置文件

按以下顺序加载(优先级递减):

  1. classpath:/config/目录下的配置文件
    例如:src/main/resources/config/application.yml
  2. 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
}

十、特定环境配置文件的覆盖规则

针对不同环境(如devprod)的配置文件(如application-dev.yml),其优先级规则相同,但仅在激活对应环境时生效。例如:

  1. 命令行参数指定的环境配置(如--spring.profiles.active=dev)优先级最高。
  2. 环境变量指定的环境配置(如SPRING_PROFILES_ACTIVE=dev)次之。
  3. 配置文件中通过spring.profiles.active指定的环境配置优先级最低。

总结

优先级顺序简化为:
命令行参数 > JNDI > 系统属性 > 环境变量 > 外部配置文件 > 内部配置文件 > @PropertySource > 默认配置

最佳实践

  1. 敏感信息(如数据库密码):通过环境变量或命令行参数配置,避免硬编码在配置文件中。
  2. 开发环境配置:使用application-dev.yml,并通过@Profile注解区分环境。
  3. 生产环境配置:优先使用外部配置文件(如./config/application.yml)或容器环境变量。
  4. 调试配置优先级:启动应用时添加--debug参数,查看Spring加载的所有配置源及其顺序。
最后修改:2025 年 07 月 03 日
如果觉得我的文章对你有用,请随意赞赏