首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring Profile 多環境配置實戰:dev/test/prod 隔離與啟動切換全攻略

     編輯:Java 綜合教學

前言:為什麼需要 Profile?

同一套代碼部署到開發、測試、生產環境,數據庫連接、Redis 地址、日誌級別、第三方 API Key 等配置各不相同。Spring Profile 提供「同一配置文件、多套環境隔離、啟動時動態切換」的優雅方案。

核心配置方式

1. XML 配置(傳統項目)

<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="https://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 開發環境 -->
    <beans profile="dev">
        <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
            <property name="jdbcUrl" value="jdbc:mysql://dev-db:3306/myapp"/>
            <property name="username" value="dev_user"/>
            <property name="password" value="dev_pwd"/>
        </bean>
    </beans>

    <!-- 測試環境 -->
    <beans profile="test">
        <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
            <property name="jdbcUrl" value="jdbc:mysql://test-db:3306/myapp"/>
            <property name="username" value="test_user"/>
            <property name="password" value="test_pwd"/>
        </bean>
    </beans>

    <!-- 生產環境 -->
    <beans profile="prod">
        <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
            <property name="jdbcUrl" value="jdbc:mysql://prod-db:3306/myapp"/>
            <property name="username" value="${prod.db.user}"/>
            <property name="password" value="${prod.db.pwd}"/>
        </bean>
    </beans>

</beans>

2. YAML 配置(Spring Boot 推薦)

# application.yml
spring:
  profiles:
    active: dev  # 默認激活

---
spring:
  config:
    activate:
      on-profile: dev
datasource:
  url: jdbc:mysql://dev-db:3306/myapp
  username: dev_user
  password: dev_pwd

---
spring:
  config:
    activate:
      on-profile: test
datasource:
  url: jdbc:mysql://test-db:3306/myapp
  username: test_user
  password: test_pwd

---
spring:
  config:
    activate:
      on-profile: prod
datasource:
  url: jdbc:mysql://prod-db:3306/myapp
  username: ${PROD_DB_USER}
  password: ${PROD_DB_PWD}

3. Properties 配置(多文件拆分)

# application-dev.properties
datasource.url=jdbc:mysql://dev-db:3306/myapp
datasource.username=dev_user
datasource.password=dev_pwd

# application-prod.properties
datasource.url=jdbc:mysql://prod-db:3306/myapp
datasource.username=prod_user
datasource.password=prod_pwd

# 主文件 application.properties
spring.profiles.active=dev
# 或引入共用配置
spring.profiles.include=common,redis,mq

啟動時激活 Profile 的 5 種方式

方式適用場景示例
JVM 參數所有部署方式通用-Dspring.profiles.active=prod
環境變量Docker/K8s/雲原生SPRING_PROFILES_ACTIVE=prod
命令行參數Jar 包直接運行java -jar app.jar --spring.profiles.active=prod
Servlet 容器上下文參數傳統 War 部署 Tomcatweb.xml 配置 spring.profiles.active context-param
代碼編程式設置測試/特殊邏輯SpringApplication.setAdditionalProfiles("prod")

web.xml 方式(傳統 War)

<context-param>
    <param-name>spring.profiles.active</param-name>
    <param-value>dev</param-value>
</context-param>
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

進階技巧

1. Profile 組合與包含

# 激活多個 profile
spring.profiles.active=dev,redis,swagger

# 在 profile 中包含其他 profile(Spring Boot 2.4+)
spring:
  config:
    activate:
      on-profile: dev
  profiles:
    include: common,redis  # 自動激活 common 和 redis

2. @Profile 註解在 Bean 上

@Configuration
@Profile("dev") // 僅 dev 環境註冊
public class DevConfig {
    @Bean
    public DataSource dataSource() { return new EmbeddedDatabaseBuilder().build(); }
}

@Configuration
@Profile("prod")
public class ProdConfig {
    @Bean
    public DataSource dataSource() { return new HikariDataSource(...); }
}

3. 條件化配置 @ConditionalOnProperty

@Bean
@ConditionalOnProperty(name = "feature.new-api", havingValue = "true")
public NewApiClient newApiClient() { return new NewApiClient(); }

最佳實踐檢查清單

  • ✅ 敏感配置(密碼、Key)絕不寫入代碼倉庫,通過環境變量/配置中心注入
  • ✅ 共用配置提取到 application-common.yml,spring.profiles.include 引入
  • ✅ Profile 命名規範:dev/test/staging/prod,避免隨意命名
  • ✅ CI/CD 流水線中通過環境變量注入對應 Profile
  • ✅ 本地開發用 application-local.yml(.gitignore 忽略),spring.profiles.active=local

總結

Spring Profile 是「配置與代碼分離、環境隔離」的基石。掌握 XML/YAML/Properties 多種配置姿勢、5 種激活方式、組合與條件化技巧,能讓應用從開發到生產「一次構建,到處運行」,構建雲原生就緒的配置管理體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved