Spring Profile 多环境配置切换详解
Spring Profile 是 Spring 框架提供的一种环境隔离机制,允许在不同环境下使用不同的配置。

基本使用方式
1 配置文件命名规则
# 默认配置(所有环境共享) application.properties # 特定环境配置 application-dev.properties # 开发环境 application-test.properties # 测试环境 application-prod.properties # 生产环境
2 YAML 格式的多文档配置
# application.yml
server:
port: 8080
# 默认配置
spring:
profiles:
active: dev
---
# 开发环境配置
spring:
profiles: dev
server:
port: 8081
database:
url: jdbc:mysql://localhost:3306/dev_db
---
# 生产环境配置
spring:
profiles: prod
server:
port: 8080
database:
url: jdbc:mysql://prod-server:3306/prod_db
激活 Profile 的多种方式
1 application.properties/yml 中配置
# application.properties spring.profiles.active=dev
2 命令行参数
# Maven 启动 mvn spring-boot:run -Dspring.profiles.active=dev # Java -jar 启动 java -jar app.jar --spring.profiles.active=prod # 或者简写 java -jar app.jar --spring.profiles.active=prod
3 环境变量
# Linux/Mac export SPRING_PROFILES_ACTIVE=dev # Windows set SPRING_PROFILES_ACTIVE=dev
4 Web 应用初始化参数
<!-- web.xml -->
<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>production</param-value>
</context-param>
Java 配置中使用 @Profile
1 注解使用
@Configuration
@Profile("dev")
public class DevConfig {
@Bean
public DataSource dataSource() {
// 开发环境数据源
return new H2DataSource();
}
}
@Configuration
@Profile("prod")
public class ProdConfig {
@Bean
public DataSource dataSource() {
// 生产环境数据源
return new MySQLDataSource();
}
}
2 复杂条件判断
@Component
@Profile("!dev")
public class ProductionService {
// 非开发环境才加载
}
@Component
@Profile({"dev", "test"})
public class DevelopmentService {
// 开发或测试环境加载
}
多环境配置示例
1 配置类示例
@Configuration
public class AppConfig {
@Bean
@Profile("dev")
public MyService devService() {
return new DevServiceImpl();
}
@Bean
@Profile("prod")
public MyService prodService() {
return new ProdServiceImpl();
}
}
2 复杂环境配置
# application.yml
spring:
profiles:
group:
"dev": [dev, mysql, rabbitmq-local]
"test": [test, h2, rabbitmq-test]
"prod": [prod, mysql, rabbitmq-prod]
---
spring:
profiles: dev
# 开发环境配置...
---
spring:
profiles: mysql
# MySQL 通用配置...
---
spring:
profiles: rabbitmq-local
# 本地 RabbitMQ 配置...
程序化获取当前 Profile
@Service
public class ProfileService {
@Autowired
private Environment env;
public void checkProfile() {
String[] activeProfiles = env.getActiveProfiles();
String[] defaultProfiles = env.getDefaultProfiles();
if (env.acceptsProfiles("dev")) {
// 开发环境逻辑
}
}
}
实际项目配置示例
1 日志配置
# logback-spring.xml
<springProfile name="dev">
<logger name="com.example" level="DEBUG"/>
</springProfile>
<springProfile name="prod">
<logger name="com.example" level="WARN"/>
</springProfile>
2 数据库配置
# 开发环境
---
spring:
profiles: dev
datasource:
url: jdbc:h2:mem:testdb
username: sa
password:
# 生产环境
---
spring:
profiles: prod
datasource:
url: jdbc:mysql://prod-db:3306/production
username: prod_user
password: ${DB_PASSWORD}
最佳实践建议
- 使用
@Profile注解 控制 Bean 的加载 - 配置文件分离:将公共配置放在
application.yml,环境特定配置放在对应文件 - 敏感信息加密:生产环境密码等使用环境变量或加密
- 使用 Profile Groups(Spring Boot 2.4+)简化配置
- 区分默认 Profile 和激活 Profile
常见问题
Q: 如何设置默认 Profile?
# application.properties spring.profiles.default=dev
Q: 多个 Profile 如何激活?
# 使用逗号分隔 java -jar app.jar --spring.profiles.active=dev,h2
Q: 如何排除某些 Profile?
@Profile("!dev")
@Component
public class NonDevService {
}
通过合理使用 Profile,可以轻松管理多环境配置,提高开发效率和系统安全性。