5月29日 01:38
Spring Boot 中如何实现多环境配置?
Spring Boot 通过 Profile 机制实现多环境配置。核心做法是创建 application-{profile}.yml 文件(如 application-dev.yml、application-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); } }