首页  

springboot环境变量替换配置文件值     所属分类 springboot 浏览量 5
使用环境变量管理配置使得应用更易于容器化部署,并能更好地适应不同的部署环境。
在 Spring Boot 中,使用环境变量替换配置文件中的值有多种方式。


1. 基本语法
在 application.properties 或 application.yml 
中使用 ${ENV_VAR_NAME} 或 ${ENV_VAR_NAME:default_value} 

# application.properties
app.name=${APP_NAME:MyApp}
app.port=${SERVER_PORT:8080}
db.url=${DATABASE_URL:jdbc:mysql://localhost:3306/mydb}



# application.yml
app:
  name: ${APP_NAME:MyApp}
  port: ${SERVER_PORT:8080}
database:
  url: ${DATABASE_URL:jdbc:mysql://localhost:3306/mydb}


2. 配置类中使用 @Value

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class AppConfig {
    
    @Value("${app.name}")
    private String appName;
    
    @Value("${app.port:8080}")
    private int port;
    
    @Value("${DATABASE_URL}")
    private String dbUrl; // 直接引用环境变量
}



3. @ConfigurationProperties 方式

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
    private String name;
    private int port;
    // getters and setters
}



# application.properties
app.name=${APP_NAME}
app.port=${APP_PORT:8080}



4. 多环境配置文件
使用 application-{profile}.properties 命名约定:

application-dev.properties    # 开发环境
application-test.properties   # 测试环境  
application-prod.properties   # 生产环境


激活特定环境:

# 命令行
java -jar app.jar --spring.profiles.active=prod

# 环境变量
export SPRING_PROFILES_ACTIVE=prod



5. Docker 示例

dockerfile

FROM openjdk:11-jre-slim
COPY target/myapp.jar app.jar
ENV SPRING_PROFILES_ACTIVE=prod \
    DATABASE_URL=jdbc:mysql://prod-db:3306/appdb \
    APP_PORT=8080
ENTRYPOINT ["java", "-jar", "/app.jar"]


6. Kubernetes ConfigMap/Secret 示例


# deployment.yaml


apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: app
        image: myapp:latest
        env:
        - name: DATABASE_URL
          valueFrom:
            configMapKeyRef:
              name: app-config
              key: database.url
        - name: APP_PORT
          value: "8080"




7. 优先级顺序
Spring Boot 配置加载优先级(从高到低):
命令行参数
Java 系统属性 (System.getProperties())
操作系统环境变量
application-{profile}.properties/yml
application.properties/yml
@PropertySource 注解
SpringApplication 默认配置

8. 实际应用示例

完整配置示例

# application.yml
spring:
  datasource:
    url: ${DB_URL:jdbc:mysql://localhost:3306/devdb}
    username: ${DB_USERNAME:root}
    password: ${DB_PASSWORD:password}
    driver-class-name: com.mysql.cj.jdbc.Driver

  redis:
    host: ${REDIS_HOST:localhost}
    port: ${REDIS_PORT:6379}

app:
  api:
    key: ${API_KEY}
    timeout: ${API_TIMEOUT:5000}
  security:
    jwt-secret: ${JWT_SECRET:default-secret-key}



启动脚本

# Linux/Mac

export DB_URL=jdbc:mysql://prod-db:3306/proddb
export DB_USERNAME=admin
export DB_PASSWORD=secret123
export REDIS_HOST=redis-service
export API_KEY=my-api-key
java -jar myapp.jar

# Windows

set DB_URL=jdbc:mysql://prod-db:3306/proddb
set DB_USERNAME=admin
java -jar myapp.jar




Docker Compose 示例

yaml 

version: '3.8'
services:
  app:
    image: myapp:latest
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - DB_URL=jdbc:mysql://mysql:3306/appdb
      - DB_USERNAME=appuser
      - DB_PASSWORD=${DB_PASSWORD}
      - REDIS_HOST=redis
    ports:
      - "8080:8080"



9. 最佳实践
敏感信息:使用环境变量存储密码、API密钥等敏感信息
默认值:为所有环境变量提供合理的默认值
命名规范:使用大写+下划线的环境变量命名(如 DB_PASSWORD)
文档化:在 README 中记录所需的环境变量

验证:应用启动时验证必需的环境变量

.env 文件:开发时可以使用 .env 文件(需要额外依赖)



# .env 文件示例
DB_URL=jdbc:mysql://localhost:3306/devdb
DB_USERNAME=dev
DB_PASSWORD=dev123
API_KEY=test-key



10. 环境变量验证


@Component
public class EnvironmentValidator implements ApplicationRunner {
    
    @Value("${REQUIRED_VAR}")
    private String requiredVar;
    
    @Override
    public void run(ApplicationArguments args) {
        if (requiredVar == null || requiredVar.isEmpty()) {
            throw new IllegalStateException("REQUIRED_VAR environment variable is not set");
        }
    }
}

上一篇    
python3 实用代码2

《走进我的交易室》精华笔记

springboot Maven 多环境构建 profile