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