5月29日 01:38

Spring Boot 中如何实现多环境配置?

Spring Boot 通过 Profile 机制实现多环境配置。核心做法是创建 application-{profile}.yml 文件(如 application-dev.ymlapplication-prod.yml),公共配置放 application.yml,环境特有配置放对应 Profile 文件,同名属性 Profile 文件覆盖默认值。激活方式包括配置文件中 spring.profiles.active、启动参数 --spring.profiles.active=prod、环境变量 SPRING_PROFILES_ACTIVE。代码层面用 @Profile 注解按环境条件注册 Bean,Spring Boot 2.4+ 还支持 spring.profiles.group 将多个 Profile 组合激活。配置优先级为:命令行参数 > 环境变量 > Profile 文件 > 默认文件。

追问

  • application.yml 和 application-dev.yml 同名属性如何取舍? Profile 文件优先,覆盖默认文件中的同名配置;若同时激活多个 Profile,后激活的覆盖先激活的。
  • @Profile 注解标注在类和方法上有什么区别? 标注在 @Configuration 类上整个配置类按条件加载,标注在 @Bean 方法上只控制单个 Bean 的注册。
  • 单文件多文档块(---分隔)和多文件方式如何选择? 多文档块适合配置较少的项目,管理简单;多文件适合配置量大、环境差异明显的项目,避免单文件过长且减少合并冲突。
  • 生产环境敏感信息如何保护? 使用环境变量 ${DB_PASSWORD} 引用,或通过 Jasypt 对配置值加密存储为 ENC(密文),运行时由加密器解密。
  • Profile 分组解决了什么问题? 一个环境可能需要同时激活多个维度(如 prod + prod-db + prod-mq),分组将它们聚合为一个名称,简化启动参数。

写段代码

java
@Configuration public class DataSourceConfig { @Bean @Profile("dev") public DataSource devDs() { return new HikariDataSource(new HikariConfig() {{ setJdbcUrl("jdbc:mysql://localhost/dev"); }}); } @Bean @Profile("prod") public DataSource prodDs() { HikariConfig c = new HikariConfig(); c.setJdbcUrl("jdbc:mysql://prod-db/prod"); c.setUsername(System.getenv("DB_USER")); return new HikariDataSource(c); } }
标签:Spring Boot