Spring Boot多环境配置案例

wen java案例 2

本文目录导读:

Spring Boot多环境配置案例

  1. 项目结构
  2. 主配置文件 application.yml
  3. 环境配置文件
  4. 代码示例
  5. 启动方式
  6. 高级特性
  7. 使用示例

我来为你提供一个完整的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

注意事项

  1. 不要将敏感信息提交到版本控制,使用环境变量或配置中心
  2. 生产环境关闭开发工具和安全日志
  3. 使用Spring Config Server来实现动态配置更新
  4. 合理使用default profile作为配置的兜底
  5. 考虑配置的优先级:命令行 > 环境变量 > 配置文件

这个案例基本覆盖了Spring Boot多环境配置的核心需求,根据项目的复杂程度,可以灵活调整配置方式和组织方式。

抱歉,评论功能暂时关闭!