本文目录导读:

我来为你提供一个完整的Spring Boot多环境配置案例。
项目结构
src/main/
├── java/com/example/demo/
│ ├── DemoApplication.java
│ ├── controller/
│ │ └── ConfigController.java
│ └── config/
│ └── DataSourceConfig.java
└── resources/
├── application.yml # 主配置
├── application-dev.yml # 开发环境
├── application-test.yml # 测试环境
├── application-prod.yml # 生产环境
└── application-local.yml # 本地环境
主配置文件 application.yml
# 应用基本信息
spring:
application:
name: multi-env-demo
profiles:
# 默认激活开发环境
active: dev
# 公共配置
server:
port: 8080
# 自定义配置示例
app:
version: 1.0.0
# 默认配置,会被环境配置覆盖
environment: default
环境配置文件
application-dev.yml(开发环境)
spring:
datasource:
url: jdbc:mysql://localhost:3306/dev_db?useSSL=false&serverTimezone=UTC
username: dev_user
password: dev_password
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
show-sql: true
hibernate:
ddl-auto: update
server:
port: 8081
# 日志配置
logging:
level:
com.example: DEBUG
org.springframework: INFO
# 自定义配置
app:
environment: development
debug: true
feature-flags:
enable-cache: false
enable-mock: true
application-test.yml(测试环境)
spring:
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
driver-class-name: org.h2.Driver
jpa:
show-sql: true
hibernate:
ddl-auto: create-drop
h2:
console:
enabled: true
server:
port: 8082
logging:
level:
com.example: DEBUG
org.springframework: INFO
app:
environment: testing
debug: true
feature-flags:
enable-cache: false
enable-mock: true
application-prod.yml(生产环境)
spring:
datasource:
url: jdbc:mysql://prod-db.example.com:3306/prod_db?useSSL=true&serverTimezone=UTC
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
show-sql: false
hibernate:
ddl-auto: validate
server:
port: 80
# 生产环境加密配置
management:
endpoints:
web:
exposure:
include: health,info,metrics
logging:
level:
com.example: WARN
org.springframework: ERROR
app:
environment: production
debug: false
feature-flags:
enable-cache: true
enable-mock: false
application-local.yml(本地环境)
spring:
datasource:
url: jdbc:h2:file:./data/local_db;DB_CLOSE_DELAY=-1
username: sa
password:
driver-class-name: org.h2.Driver
server:
port: 8080
logging:
level:
com.example: TRACE
app:
environment: local
debug: true
feature-flags:
enable-cache: false
enable-mock: true
代码示例
配置文件绑定类
@Configuration
@ConfigurationProperties(prefix = "app")
public class AppConfig {
private String version;
private String environment;
private boolean debug;
private FeatureFlags featureFlags = new FeatureFlags();
// getters and setters
// 可以覆盖toString()方法便于调试
public static class FeatureFlags {
private boolean enableCache;
private boolean enableMock;
// getters and setters
}
}
配置正确的使用方式
@RestController
@RequestMapping("/api/config")
public class ConfigController {
@Autowired
private AppConfig appConfig;
@Autowired
private Environment environment;
@GetMapping("/info")
public Map<String, Object> getConfig() {
Map<String, Object> config = new HashMap<>();
config.put("version", appConfig.getVersion());
config.put("environment", appConfig.getEnvironment());
config.put("debug", appConfig.isDebug());
config.put("activeProfiles", Arrays.asList(environment.getActiveProfiles()));
config.put("featureFlags", appConfig.getFeatureFlags());
// 读取特定的配置项
String databaseUrl = environment.getProperty("spring.datasource.url");
config.put("databaseUrl", databaseUrl);
return config;
}
@GetMapping("/profiles")
public String getActiveProfiles() {
// 输出当前激活的环境
return String.join(",", environment.getActiveProfiles());
}
}
启动方式
通过IDE配置
在IDE的运行配置中添加VM参数:
-Dspring.profiles.active=dev
命令行启动
# 使用Maven mvn spring-boot:run -Dspring-boot.run.profiles=dev # 使用Java命令 java -jar demo.jar --spring.profiles.active=dev # 多环境激活(可以有多个profile) java -jar demo.jar --spring.profiles.active=dev,test
环境变量
# Linux/Unix export SPRING_PROFILES_ACTIVE=prod # Windows set SPRING_PROFILES_ACTIVE=prod
修改application.yml
spring:
profiles:
active: dev
profiles:
include: dev,test # 包含多个profile
高级特性
条件配置
@Configuration
@Profile("dev")
public class DevConfig {
@Bean
public MyService myService() {
return new DevMyService();
}
}
// 或者使用注解
@Service
@Profile("test")
public class TestService {
// 只在测试环境注册
}
配置文件分组
# application.yml
spring:
profiles:
group:
dev: dev-datasource, dev-cache
prod: prod-datasource, prod-cache
多环境Jar打包
<!-- pom.xml -->
<profiles>
<profile>
<id>dev</id>
<properties>
<activatedProperties>dev</activatedProperties>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<activatedProperties>prod</activatedProperties>
</properties>
</profile>
</profiles>
使用示例
启动不同环境
# 开发环境 java -jar multi-env-demo.jar --spring.profiles.active=dev # 生产环境(从环境变量读取敏感信息) DB_USERNAME=admin DB_PASSWORD=secret java -jar multi-env-demo.jar --spring.profiles.active=prod # 本地测试 java -jar multi-env-demo.jar --spring.profiles.active=local
注意事项
- 不要将敏感信息提交到版本控制,使用环境变量或配置中心
- 生产环境关闭开发工具和安全日志
- 使用Spring Config Server来实现动态配置更新
- 合理使用default profile作为配置的兜底
- 考虑配置的优先级:命令行 > 环境变量 > 配置文件
这个案例基本覆盖了Spring Boot多环境配置的核心需求,根据项目的复杂程度,可以灵活调整配置方式和组织方式。