Spring Boot中如何让application.properties正确读取环境变量?
解决Spring Boot读取系统环境变量失效问题及JWT属性配置
一、先排查环境变量本身的有效性
- 先验证环境变量是否正确设置:
- Windows(CMD):执行
echo %SPRING_DATASOURCE_URL%,确认输出预期值 - Linux/macOS:执行
echo $SPRING_DATASOURCE_URL,确认输出预期值
- Windows(CMD):执行
- 如果是在IDE中运行项目,必须重启IDE——IDE启动时会加载系统环境变量,修改环境变量后不重启不会生效;也可以直接在IDE的「运行配置」中手动添加环境变量,这种方式更可靠,不受系统环境变量的影响。
二、application.properties的正确写法
- 变量名严格区分大小写,必须和系统环境变量完全一致,比如环境变量是
SPRING_DATASOURCE_URL,配置里必须写:spring.datasource.url=${SPRING_DATASOURCE_URL} spring.datasource.username=${SPRING_DATASOURCE_USERNAME} spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} - 不要使用SpEL的
#{}语法(除非需要复杂表达式),直接用${}就是Spring读取环境变量的标准方式。
三、自定义配置类的正确实现(如果需要手动配置DataSource)
如果之前的自定义配置类失效,检查以下几点:
- 确保配置类被Spring扫描到(放在主启动类的同包/子包下,或通过
@ComponentScan指定扫描路径) - 用
@Value正确绑定环境变量,示例:
@Configuration public class DataSourceConfig { @Value("${SPRING_DATASOURCE_URL}") private String dbUrl; @Value("${SPRING_DATASOURCE_USERNAME}") private String dbUsername; @Value("${SPRING_DATASOURCE_PASSWORD}") private String dbPassword; @Bean public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setUrl(dbUrl); dataSource.setUsername(dbUsername); dataSource.setPassword(dbPassword); return dataSource; } }
四、用环境变量配置JWT属性的方法
和数据源配置逻辑完全一致:
- 先在系统中设置对应的环境变量,比如
JWT_SECRET、JWT_EXPIRATION_MS - 在application.properties中添加映射:
application.jwt.secret=${JWT_SECRET} application.jwt.expiration-ms=${JWT_EXPIRATION_MS}
- 用
@ConfigurationProperties批量绑定(更规范):
@Configuration @ConfigurationProperties(prefix = "application.jwt") public class JwtConfig { private String secret; private Long expirationMs; // 生成getter和setter方法 }
Spring会自动将大写下划线格式的环境变量(如JWT_SECRET)映射为驼峰命名的属性(secret)。
额外注意事项
- 不要给环境变量配置默认值,避免敏感数据意外写入配置文件提交到GitHub;如果环境变量未设置,项目启动会报错,这反而能提醒你配置缺失。
- 确保
.gitignore中包含application-local.properties、application-dev.properties等本地配置文件,只提交作为模板的application.properties(里面只保留${变量名}的占位符)。
内容的提问来源于stack exchange,提问作者Bodea Tudor
相关产品推荐
相关产品推荐

