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,可以轻松管理多环境配置,提高开发效率和系统安全性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播