在 Spring Boot 中,多环境配置是一种常见的需求。例如,开发环境、测试环境和生产环境可能需要不同的数据库连接、日志级别或其他配置。Spring Boot 提供了灵活的多环境配置机制,通过 application.properties
或 application.yml
或 application.yaml
文件可以轻松实现。
假设我们有以下三个环境:
dev
)test
)prod
)application.properties
或 application.yml
或 application.yaml
application-dev.properties
或 application-dev.yml
或 application-dev.yaml
(开发环境)application-test.properties
或 application-test.yml
或 application-test.yaml
(测试环境)application-prod.properties
或 application-prod.yml
或 application-prod.yaml
(生产环境)主配置文件 application.properties
或 application.yml
或 application.yaml
是全局默认配置文件。你可以在这里定义所有环境通用的配置,并指定激活的环境。
application.properties
properties# 全局默认配置 server.port=8080 # 激活的环境 spring.profiles.active=dev
application.yml
或 application.yaml
yamlserver:
port: 8080
spring:
profiles:
active: dev
每个环境的配置文件只包含该环境特有的配置。如果某个配置项没有在环境特定配置文件中定义,则会回退到主配置文件中的默认值。
application-dev.properties
properties# 开发环境配置 server.port=8081 spring.datasource.url=jdbc:mysql://localhost:3306/devdb spring.datasource.username=devuser spring.datasource.password=devpassword logging.level.root=DEBUG
application-test.properties
properties# 测试环境配置 server.port=8082 spring.datasource.url=jdbc:mysql://localhost:3306/testdb spring.datasource.username=testuser spring.datasource.password=testpassword logging.level.root=INFO
application-prod.properties
properties# 生产环境配置 server.port=8083 spring.datasource.url=jdbc:mysql://prod-server:3306/proddb spring.datasource.username=produser spring.datasource.password=prodpassword logging.level.root=WARN
Spring Boot 使用 spring.profiles.active
属性来决定当前激活的环境。有多种方式可以设置这个属性:
在 application.properties
或 application.yml
中直接指定:
propertiesspring.profiles.active=dev
运行应用程序时,可以通过命令行参数指定激活的环境:
bashjava -jar myapp.jar --spring.profiles.active=prod
可以通过环境变量设置:
bashexport SPRING_PROFILES_ACTIVE=prod
java -jar myapp.jar
如果你使用的是 IntelliJ IDEA 或 Eclipse,可以在运行配置中添加 VM 参数或环境变量:
-Dspring.profiles.active=dev
SPRING_PROFILES_ACTIVE=dev
Spring Boot 的配置加载顺序决定了多环境配置的优先级。以下是常见的优先级(从高到低):
application-{profile}.properties
或 application-{profile}.yml
application.properties
或 application.yml
这意味着,命令行参数中的配置会覆盖环境特定配置文件中的配置,而环境特定配置文件中的配置又会覆盖主配置文件中的配置。
如果你使用的是 application.yml
或 application.yaml
,可以通过 ---
分隔符在同一文件中定义多个环境的配置。
application.yml
或 application.yaml
yaml# 全局默认配置
server:
port: 8080
spring:
profiles:
active: dev
---
# 开发环境配置
spring:
profiles: dev
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://localhost:3306/devdb
username: devuser
password: devpassword
logging:
level:
root: DEBUG
---
# 测试环境配置
spring:
profiles: test
server:
port: 8082
spring:
datasource:
url: jdbc:mysql://localhost:3306/testdb
username: testuser
password: testpassword
logging:
level:
root: INFO
---
# 生产环境配置
spring:
profiles: prod
server:
port: 8083
spring:
datasource:
url: jdbc:mysql://prod-server:3306/proddb
username: produser
password: prodpassword
logging:
level:
root: WARN
在开发过程中,你可能需要频繁切换环境。可以通过以下方式快速切换:
application.properties
中的 spring.profiles.active
。bashjava -jar myapp.jar --spring.profiles.active=test
敏感信息保护 如果配置文件中包含敏感信息(如数据库密码),建议使用加密工具(如 Jasypt)对这些信息进行加密。
避免重复配置 尽量将通用的配置放在主配置文件中,只有环境特定的配置才放在对应的环境配置文件中。
测试环境配置 在测试环境中,确保配置与生产环境尽可能一致,以减少因环境差异导致的问题。