配置
对应 Laravel 的"配置"章节,以 PHP 开发者视角理解 Spring Boot 的配置体系。
核心概念对照表
| Laravel | Spring Boot | 说明 |
|---|---|---|
.env | application.yml 或 application.properties | 项目配置文件 |
.env.local / .env.prod | application-dev.yml / application-prod.yml | 环境专属配置 |
config('app.name') | @Value("${app.name}") 或 Environment | 读取配置值 |
config/app.php | Spring Boot 自动配置 + 自定义 @ConfigurationProperties | 配置组织结构 |
config/database.php | application.yml 中的 spring.datasource.* | 数据库配置 |
1. 配置文件格式
application.properties(键值对风格,类似 .env)
properties
# application.properties(类比 .env 键值对风格)
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/my_app
spring.datasource.username=root
spring.datasource.password=secret
app.name=My Spring Appapplication.yml(推荐,类似 YAML 格式的配置,更清晰)
yaml
# application.yml(推荐使用,层级结构更直观)
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://localhost:3306/my_app
username: root
password: secret
app:
name: My Spring App💡 YAML vs properties: YAML 是更现代的选择,PHP 开发者可以类比为
.yaml格式的多层配置,避免了spring.datasource.url这种重复前缀的写法。
2. 多环境配置(类比 .env.local / .env.prod)
文件命名规则
| Laravel | Spring Boot |
|---|---|
.env | application.yml(默认) |
.env.local | application-dev.yml(开发环境) |
.env.prod | application-prod.yml(生产环境) |
APP_ENV=local | spring.profiles.active=dev |
使用方式
yaml
# application.yml(所有环境公用的配置)
server:
port: 8080
spring:
profiles:
active: dev # 类比 APP_ENV=dev,激活 dev 环境yaml
# application-dev.yml(类比 .env.local)
server:
port: 8080 # 开发环境用 8080 端口
spring:
datasource:
url: jdbc:h2:mem:devdb # 开发用内存数据库yaml
# application-prod.yml(类比 .env.prod)
server:
port: 80
spring:
datasource:
url: jdbc:mysql://prod-server:3306/my_app
username: ${DB_USERNAME} # 支持 ${} 引用环境变量
password: ${DB_PASSWORD}激活环境(类比 APP_ENV)
bash
# 方式1:在 application.yml 中设置
spring.profiles.active=prod
# 方式2:启动参数(类似 APP_ENV=production php artisan serve)
java -jar my-app.jar --spring.profiles.active=prod
# 方式3:环境变量
export SPRING_PROFILES_ACTIVE=prod3. 读取配置值
@Value 注解(类比 config('xxx'))
java
@Component // 类比:注册为一个服务/组件
public class AppConfig {
@Value("${app.name}") // 类比 config('app.name')
private String appName;
@Value("${server.port:8080}") // 类比 config('app.port', 8080),带默认值
private int port;
public void printConfig() {
System.out.println("App: " + appName + ", Port: " + port);
}
}@ConfigurationProperties(类比 Laravel 的 Config 类绑定)
PHP/Laravel 中你可能会写:
php
// Laravel 自定义配置类
class AppConfig {
public function __construct(
public string $name,
public int $port
) {}
}
// 使用:app(AppConfig::class)Spring Boot 中的等价写法:
java
// application.yml 中有如下配置:
// app:
// name: My App
// port: 8080
@Component
@ConfigurationProperties(prefix = "app") // 绑定 app.* 下的所有配置
public class AppProperties {
private String name;
private int port;
// getter / setter(需要提供,否则无法绑定)
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getPort() { return port; }
public void setPort(int port) { this.port = port; }
}
// 使用时注入即可
@RestController
public class ConfigController {
@Autowired
private AppProperties appProps; // 类比 app(AppConfig::class)
}💡 PHP 差异: Java 的
@ConfigurationProperties强制要求提供 getter/setter,这是因为 Java 使用 POJO 规范(Plain Old Java Object),不像 PHP 可以直接用 public 属性或__get魔术方法。Lombok 注解可以自动生成这些 getter/setter(见后的 Lombok 章节)。
4. 外部化配置优先级
Spring Boot 的配置覆盖规则(从低到高):
application.yml默认配置application-{profile}.yml环境配置- JAR 包外的
application.yml(类比.env不在版本控制中) @Value注解的默认值- 命令行参数
--server.port=9090 - 操作系统环境变量
想象 Laravel 中
.env→.env.local→ 环境变量 → 直接传参 的覆盖链,Spring Boot 的逻辑完全一致,只是载体变成了 YAML 文件。
5. 与 Laravel 配置的关键差异
| 特性 | Laravel | Spring Boot |
|---|---|---|
| 默认配置位置 | config/*.php + .env | application.yml 单个文件即可 |
| 配置组织方式 | PHP 数组,config/database.php 按组件拆分 | YAML 层级,spring.datasource.* 统一前缀 |
| 环境变量引用 | env('DB_HOST', '127.0.0.1') | ${DB_HOST:127.0.0.1} |
| 运行时修改 | 修改后立即生效(OPcache 可能缓存) | 需重启应用(DevTools 配置下可自动触发 restart) |
| 类型安全 | PHP 动态类型,配置值都是字符串 | @ConfigurationProperties 可校验类型 |
| 配置缓存 | php artisan config:cache | 不需要,Spring Boot 启动时解析并缓存所有配置 |
总结:PHP 开发者踩坑提醒
- YAML 缩进极其敏感 —— 类似 Python,必须统一空格对齐(从不用 Tab)。配置出错时 Spring Boot 会在启动时报
YAMLException - 值全部小写布尔值 —— YAML 中
true/false/yes/no都是合法的布尔值,但建议统一用true/false - 不要将敏感信息硬编码 —— 数据库密码等应使用
${}引用环境变量,而不是写在 YAML 中 - 配置文件加载失败不会报错 —— 如果配错了
spring.profiles.active=dev但application-dev.yml不存在,Spring Boot 会静默忽略,而不是警告