当前位置: 首页 > news >正文

Spring Boot属性设置方法及优先级完整说明+表格对比

Spring Boot属性设置方法及优先级完整说明

官网参考:
https://docs.spring.io/spring-boot/3.4-SNAPSHOT/reference/features/external-config.html#features.external-config.files

属性设置方法优先级顺序(从高到低)
  1. 命令行参数--key=value
  2. SpringApplication.setDefaultProperties(默认属性)
  3. 系统属性-Dkey=value
  4. JNDI属性(通过JNDI接口)
  5. 来自java:comp/env的JNDI属性
  6. 操作系统环境变量NAME=value
  7. 随机属性random.*,需启用或显式配置)
  8. 外部配置文件application-{profile}.propertiesapplication.yml
  9. 内部配置文件application-{profile}.propertiesapplication.yml
  10. 外部通用配置文件application.propertiesapplication.yml
  11. 内部通用配置文件application.propertiesapplication.yml
  12. @PropertySource 注解
  13. @Value 注解
  14. @ConfigurationProperties 绑定
  15. Environment 直接获取

代码示例

1. 命令行参数
// 启动命令:java -jar app.jar --name=CommandLine
@Configuration
public class CommandLineConfig {
    @Value("${name:Default}") 
    private String name; // 默认值为Default

    @Bean
    public String getName() {
        return name;
    }
}

2. SpringApplication.setDefaultProperties
// 启动类中设置默认属性
public static void main(String[] args) {
    Map<String, Object> defaultProps = new HashMap<>();
    defaultProps.put("name", "SpringAppDefault");
    SpringApplication app = new SpringApplication(App.class);
    app.setDefaultProperties(defaultProps);
    app.run(args);
}

3. 系统属性
// 启动命令:java -Dname=SystemProp -jar app.jar
@Configuration
public class SystemPropConfig {
    @Value("${name:Default}") 
    private String name;

    @Bean
    public String getName() {
        return name;
    }
}

4. JNDI属性
// 需要JNDI服务器配置(如Tomcat)
// JNDI绑定示例(需实现JNDI环境):
// Context context = new InitialContext();
// context.bind("java:comp/env/name", "JNDIValue");

@Configuration
public class JndiConfig {
    @Value("${name:Default}") 
    private String name;

    @Bean
    public String getName() {
        return name;
    }
}

5. 操作系统环境变量
# 在操作系统中设置环境变量
export NAME=OsEnvVar
@Configuration
public class OsEnvConfig {
    @Value("${name:Default}") 
    private String name;

    @Bean
    public String getName() {
        return name;
    }
}

6. 随机属性(random.*
# application.properties
random.name=RandomValue
@Component
public class RandomBean {
    @Value("${name:Default}") 
    private String name;

    public String getName() {
        return name;
    }
}

7. 外部/内部配置文件(带profile)
# 外部配置文件:application-dev.properties(优先级高于内部文件)
name=ExternalProfile
# 内部配置文件:src/main/resources/application-dev.yml
name: InternalProfile
// 启动时指定profile:
java -jar app.jar --spring.profiles.active=dev

8. @PropertySource
@Configuration
@PropertySource("classpath:custom.properties") // 指定自定义配置文件
public class PropertySourceConfig {
    @Value("${name:Default}") 
    private String name;

    @Bean
    public String getName() {
        return name;
    }
}
# custom.properties
name=PropertySource

9. Environment 直接获取
@Service
public class EnvironmentService {
    @Autowired
    private Environment env;

    public String getName() {
        return env.getProperty("name", "Default");
    }
}

对比表格

方法使用方式优先级适用场景示例代码片段
命令行参数--key=value 启动时指定最高运行时动态覆盖配置java -jar app.jar --name=CommandLine
SpringApplication.setDefaultProperties通过代码设置默认属性(启动类中配置)程序启动前设置默认值app.setDefaultProperties(defaultProps)
系统属性-Dkey=value 启动时指定次之JVM 级别配置java -Dname=SystemProp -jar app.jar
JNDI属性通过JNDI接口绑定(需JNDI服务器支持)较高企业级环境(如Tomcat)中的集中配置new InitialContext().bind("java:comp/env/name", "JNDIValue")
java:comp/env 的JNDI属性通过java:comp/env前缀绑定中高标准化JNDI配置路径@Value("${name}") 绑定到java:comp/env/name
操作系统环境变量操作系统设置环境变量(如export NAME=Value中高跨平台环境变量配置export NAME=OsEnvVar
随机属性(random.*在配置文件中设置random.*前缀的属性中等生成随机值(如密码、密钥)random.name=RandomValue
外部配置文件(带profile)独立于jar的application-{profile}.propertiesapplication.yml中等环境特定配置(如dev/test/prod)src/main/resources/application-dev.properties
内部配置文件(带profile)jar包内的application-{profile}.propertiesapplication.yml中等内置环境配置src/main/resources/application-dev.yml
外部通用配置文件独立于jar的application.propertiesapplication.yml中低通用配置覆盖内部文件src/main/resources/application.properties
内部通用配置文件jar包内的application.propertiesapplication.yml中低基础配置src/main/resources/application.yml
@PropertySource@Configuration类中通过注解指定外部属性文件较低自定义配置文件绑定@PropertySource("classpath:custom.properties")
@Value直接注入字段较低简单单值注入@Value("${name}") private String name;
@ConfigurationProperties绑定POJO对象到配置前缀最低复杂对象配置绑定@ConfigurationProperties(prefix = "user")
Environment通过Environment抽象类获取属性最低需要灵活获取多种属性的场景env.getProperty("name", "Default")

优先级验证示例

假设同时设置以下属性:

  • 命令行参数--name=CommandLine
  • 系统属性-Dname=SystemProp
  • 环境变量export NAME=OsEnvVar
  • 配置文件application.properties 中设置 name=ConfigFile

实际运行时,CommandLine 的值会生效,因为命令行参数的优先级最高。如果移除命令行参数,则系统属性的值 SystemProp 会生效,依此类推。

相关文章:

  • PyTorch图像预处理--Compose
  • 分别通过 JNI和纯java 实现对 Windows 注册表的增删改查操作的完整示例,包含详细注释和步骤说明
  • 【设计模式】工厂模式详解-----简单工厂模式、工厂方法模式、抽象工厂模式
  • 当一个按键“摆烂”时,需要更换整个键盘吗?
  • Selenium之简介
  • Json冲突崩溃问题
  • Logit-Laplace 分布:解决图像生成中像素值范围匹配问题的创新分布
  • cellnet框架概述
  • SQL 函数
  • stm32 f1 外接大功率负载方案 6DI/8DO/4AI/1AO
  • Node.js 模块系统
  • 【Linux】MAC帧
  • ClickHouse常见问题总结
  • DeepSeek概述
  • Oracle常用分析诊断工具(9)——ADDM
  • Linux——进程信号(1)(signal与sigaction)
  • mapreduce是如何进行迭代式计算的
  • Dify 部署指南-离线版
  • 页面元素内容太长,给元素添加title
  • Python+AI助力智能仓储:效率与科技的完美融合
  • 宿州市委副书记任东已任市政府党组书记
  • “75后”袁达已任国家发改委秘书长
  • 我国首部《人工智能气象应用服务办法》今天发布
  • 武汉一季度GDP为4759.41亿元,同比增长5.4%
  • 找化学的答案,解人类的命题:巴斯夫的“变革者”成长之道
  • 第1现场|无军用物资!伊朗港口爆炸已遇难40人伤1200人