Skip to content

配置

对应 Laravel 的"配置"章节,以 PHP 开发者视角理解 Spring Boot 的配置体系。


核心概念对照表

LaravelSpring Boot说明
.envapplication.ymlapplication.properties项目配置文件
.env.local / .env.prodapplication-dev.yml / application-prod.yml环境专属配置
config('app.name')@Value("${app.name}")Environment读取配置值
config/app.phpSpring Boot 自动配置 + 自定义 @ConfigurationProperties配置组织结构
config/database.phpapplication.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 App

application.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

文件命名规则

LaravelSpring Boot
.envapplication.yml(默认)
.env.localapplication-dev.yml(开发环境)
.env.prodapplication-prod.yml(生产环境)
APP_ENV=localspring.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=prod

3. 读取配置值

@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 的配置覆盖规则(从低到高):

  1. application.yml 默认配置
  2. application-{profile}.yml 环境配置
  3. JAR 包外的 application.yml(类比 .env 不在版本控制中)
  4. @Value 注解的默认值
  5. 命令行参数 --server.port=9090
  6. 操作系统环境变量

想象 Laravel 中 .env.env.local → 环境变量 → 直接传参 的覆盖链,Spring Boot 的逻辑完全一致,只是载体变成了 YAML 文件。


5. 与 Laravel 配置的关键差异

特性LaravelSpring Boot
默认配置位置config/*.php + .envapplication.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 开发者踩坑提醒

  1. YAML 缩进极其敏感 —— 类似 Python,必须统一空格对齐(从不用 Tab)。配置出错时 Spring Boot 会在启动时报 YAMLException
  2. 值全部小写布尔值 —— YAML 中 true / false / yes / no 都是合法的布尔值,但建议统一用 true / false
  3. 不要将敏感信息硬编码 —— 数据库密码等应使用 ${} 引用环境变量,而不是写在 YAML 中
  4. 配置文件加载失败不会报错 —— 如果配错了 spring.profiles.active=devapplication-dev.yml 不存在,Spring Boot 会静默忽略,而不是警告

面向 PHP 开发者的 Spring Boot 文档