一、为什么需要多环境配置
在实际项目开发中,我们通常需要将应用部署到不同的环境中,比如:
- 开发环境(dev) - 开发人员本地开发调试使用
- 测试环境(test) - 测试人员功能测试使用
- 生产环境(prod) - 线上正式运行的环境
不同环境往往需要不同的配置,比如数据库连接、Redis配置、文件存储路径等。Spring Boot提供了完善的多环境配置支持,可以让我们轻松管理不同环境的配置。
二、Spring Boot多环境配置实现方式
1. 使用profile-specific配置文件
这是Spring Boot推荐的方式,命名格式为:application-{profile}.properties
或application-{profile}.yml
示例:
application.yml # 主配置文件
application-dev.yml # 开发环境配置
application-test.yml # 测试环境配置
application-prod.yml # 生产环境配置
配置示例(application.yml):
spring:
profiles:
active: dev # 默认激活dev环境
application-dev.yml:
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: dev_user
password: dev_pass
application-prod.yml:
server:
port: 80
spring:
datasource:
url: jdbc:mysql://prod-server:3306/prod_db
username: prod_user
password: prod_pass
2. 在YAML文件中使用多文档块
如果你更喜欢把所有环境配置放在一个文件中,可以使用YAML的多文档块特性:
# 公共配置
spring:
application:
name: my-app
---
# 开发环境
spring:
profiles: dev
server:
port: 8080
---
# 生产环境
spring:
profiles: prod
server:
port: 80
3. 使用@Profile注解
除了配置文件外,还可以在代码中使用@Profile
注解来指定特定环境下才生效的Bean:
@Configuration
@Profile("dev")
public class DevConfig {
@Bean
public DataSource dataSource() {
// 开发环境数据源配置
}
}
@Configuration
@Profile("prod")
public class ProdConfig {
@Bean
public DataSource dataSource() {
// 生产环境数据源配置
}
}
三、激活指定环境的几种方式
1. 配置文件中指定
# application.yml
spring:
profiles:
active: dev
2. 命令行参数指定
java -jar myapp.jar --spring.profiles.active=prod
3. 系统环境变量指定
export SPRING_PROFILES_ACTIVE=prod
java -jar myapp.jar
4. JVM参数指定
java -Dspring.profiles.active=test -jar myapp.jar
四、最佳实践建议
- 合理组织配置文件:将不同环境的配置分离到不同文件中,保持清晰
- 提取公共配置:将各环境通用的配置放在
application.yml
中,环境特有配置放在application-{profile}.yml
中 - 敏感信息保护:生产环境的密码等敏感信息不要直接写在配置文件中,可以使用配置中心或加密处理
- 环境隔离:确保开发、测试、生产环境完全隔离,避免相互影响
- 默认环境设置:在开发阶段可以设置默认激活dev环境,但在生产部署时一定要通过命令行参数明确指定
五、实际案例演示
需要都在resources文件下
application.yml(公共配置)
spring:
application:
name: multi-env-demo
profiles:
active: dev # 默认开发环境
# 公共配置
logging:
level:
root: info
application-dev.yml
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db
username: dev_user
password: dev_pass
redis:
host: localhost
port: 6379
custom:
env: development
api:
base-url: http://dev.api.example.com
application-prod.yml
server:
port: 80
spring:
datasource:
url: jdbc:mysql://prod-db.example.com:3306/prod_db
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
redis:
host: redis-prod.example.com
port: 6379
custom:
env: production
api:
base-url: https://api.example.com
读取配置的Java代码示例
@RestController
public class EnvController {
@Value("${custom.env}")
private String env;
@Value("${custom.api.base-url}")
private String apiBaseUrl;
@GetMapping("/env")
public String getEnvInfo() {
return "Current Environment: " + env + ", API Base URL: " + apiBaseUrl;
}
}
六、总结
Spring Boot的多环境配置功能强大且灵活,通过本文介绍的方法,你可以轻松管理不同环境的配置。关键点总结:
- 使用
application-{profile}.yml
文件管理不同环境配置 - 通过多种方式激活特定环境
- 合理组织配置文件结构,提取公共配置
- 结合
@Profile
注解实现更细粒度的环境控制
掌握这些技巧后,你的应用将能够轻松适应各种部署环境,大大提高开发和部署效率。