Spring Boot 环境变量与系统属性
环境变量和系统属性是Spring Boot重要的外部配置来源,适合容器化部署场景。
系统属性
设置方式
Java
// 方式一:启动脚本
java -Dserver.port=8081 -jar app.jar
// 方式二:代码设置(启动前)
System.setProperty("server.port", "8081");
// 方式三:命令行参数转换
java -jar app.jar --server.port=8081 // 自动转为系统属性
优先级
系统属性优先级仅次于命令行参数:
| 优先级 | 配置来源 |
|---|---|
| 1 | 命令行参数 |
| 2 | Java系统属性 |
| 3 | 环境变量 |
| 4 | 配置文件 |
环境变量
设置方式
Bash
# Linux/Mac
export SERVER_PORT=8081
java -jar app.jar
# Windows
set SERVER_PORT=8081
java -jar app.jar
# Docker
docker run -e SERVER_PORT=8081 myapp
# Kubernetes
env:
- name: SERVER_PORT
value: "8081"
命名转换规则
环境变量命名转换为Spring属性:
| 环境变量 | Spring属性 |
|---|---|
| SERVER_PORT | server.port |
| SPRING_PROFILES_ACTIVE | spring.profiles.active |
| MY_SERVICE_HOST_NAME | my.service.host-name |
| MY_SERVICE_HOSTNAME | my.service.hostname |
环境变量转属性规则:去掉下划线,小写,转点号和下划线。
属性绑定机制
Java
// EnvironmentPropertySource加载环境变量
// SystemEnvironmentPropertySource处理命名转换
public class SystemEnvironmentPropertySource extends PropertySource<Map<String, Object>> {
// 支持多种命名格式查找
// SERVER_PORT -> server.port
// Server_Port -> server.port
// server.port -> server.port
}
环境变量覆盖系统属性
Bash
# 同时设置
java -Dserver.port=8080 -jar app.jar
export SERVER_PORT=8081
# 结果:8080(系统属性优先级高于环境变量)
配置属性与环境变量
YAML
# application.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
Bash
# 通过环境变量覆盖
export SPRING_DATASOURCE_URL=jdbc:mysql://prod-db:3306/mydb
export SPRING_DATASOURCE_USERNAME=prod_user
容器化配置示例
Docker
Bash
# Dockerfile
ENV SERVER_PORT=8080
# docker run
docker run -e SERVER_PORT=9090 \
-e SPRING_PROFILES_ACTIVE=prod \
myapp
Kubernetes
YAML
apiVersion: v1
kind: Pod
spec:
containers:
- name: myapp
image: myapp:latest
env:
- name: SERVER_PORT
value: "8081"
- name: SPRING_PROFILES_ACTIVE
value: "prod"
- name: SPRING_DATASOURCE_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url
常用环境变量
| 环境变量 | 说明 |
|---|---|
| SPRING_PROFILES_ACTIVE | 激活Profile |
| SERVER_PORT | 服务端口 |
| SPRING_DATASOURCE_URL | 数据源URL |
| SPRING_DATASOURCE_USERNAME | 数据库用户名 |
| SPRING_DATASOURCE_PASSWORD | 数据库密码 |
| JAVA_OPTS | JVM参数 |
获取环境配置
Java
@Component
public class MyComponent {
@Autowired
private Environment environment;
public void process() {
String port = environment.getProperty("server.port");
String url = environment.getProperty("spring.datasource.url");
}
// 通过@Value注入
@Value("${server.port}")
private String port;
}
环境变量限制
Bash
# 环境变量不支持复杂对象绑定
# 需使用配置文件或命令行参数
# 集合/数组
SPRING_APPLICATION_JSON='{"my":{"list":["a","b"]}}'
要点总结
- 系统属性使用-D参数设置,优先级高于环境变量
- 环境变量命名转换:下划线分隔,大写
- 环境变量适合容器化部署配置
- Environment.getProperty获取配置值
- 系统属性和环境变量均支持松散绑定
📝 发现内容有误?点击此处直接编辑