文档站点
Skip to content

配置中心 ​

Laravel 用 .env 文件 + config/ 目录管理配置;Spring Boot 用 application.yml(或 application.properties)一个文件搞定,并支持「按环境拆分」和「类型安全配置类」。

配置文件在哪 ​

src/main/resources/ 下的:

  • application.properties(默认生成,key=value 风格)
  • application.yml(推荐,层级缩进风格,更接近人脑思考)

两种格式等价,推荐 YAML。用 application.yml 时把 .properties 删掉即可:

yaml
server:
  port: 8080
  servlet:
    context-path: /api        # 所有接口的统一前缀,相当于 Laravel 的 Route::prefix

spring:
  application:
    name: demo
  datasource:
    url: jdbc:mysql://localhost:3306/demo
    username: root
    password: secret

对应的 .properties 写法是扁平的:

properties
server.port=8080
server.servlet.context-path=/api
spring.application.name=demo
spring.datasource.url=jdbc:mysql://localhost:3306/demo

类比 Laravel

  • server.port ≈ php artisan serve --port
  • spring.datasource.* ≈ DB_HOST、DB_DATABASE
  • 配置项虽然没有 config/ 那么多文件,但数量同样庞大,好在大多数都有默认值,只写你需要覆盖的即可。

按环境拆分:Profile ​

Laravel 用 .env.dev / .env.prod 区分环境;Spring Boot 用 Profile:

application.yml           ← 通用配置
application-dev.yml       ← 开发环境(dev profile)
application-prod.yml      ← 生产环境(prod profile)
yaml
# application.yml
spring:
  profiles:
    active: dev        # 相当于 APP_ENV=dev
yaml
# application-dev.yml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/demo_dev

也可以用 --spring.profiles.active=prod 启动参数覆盖,这在 Docker 部署时很常用(见 部署)。

读取配置:三种方式 ​

1. @Value —— 像 env('KEY') ​

java
@RestController
public class ConfigController {

    @Value("${app.name:demo}")
    private String appName;

    @GetMapping("/name")
    public String name() {
        return appName;
    }
}

${app.name:demo} 表示读取 app.name,没配置就用默认值 demo。

2. @ConfigurationProperties —— 像 config('app.xxx'),还带类型检查 ​

推荐的方式。定义一个类,自动把配置里的一组 key 绑定成强类型字段:

yaml
# application.yml
app:
  name: demo
  upload-dir: /data/uploads
  max-size: 100MB
java
package com.example.demo.config;

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

@Data
@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
    private String name;
    private String uploadDir;   // 自动将 upload-dir 映射为 uploadDir
    private String maxSize;
}

然后在任何地方注入使用:

java
@Service
public class UploadService {
    private final AppProperties props;

    public UploadService(AppProperties props) {
        this.props = props;
    }

    public void doUpload() {
        System.out.println(props.getUploadDir());
    }
}

为什么推荐这种方式?

Laravel 里 config('xxx') 返回的是数组,键写错了要到运行时才发现。@ConfigurationProperties 在应用启动时就校验并绑定,拼写错误直接启动失败,把错误提前暴露。字段名用驼峰,配置文件里用中划线/驼峰都能自动匹配。

3. Environment —— 偶尔用 ​

java
@RestController
public class EnvController {
    @Autowired
    private Environment env;

    @GetMapping("/env")
    public String env() {
        return env.getProperty("app.name");
    }
}

@Autowired 字段注入与构造器注入

字段注入(@Autowired private Environment env;)写起来快,但业界更推荐构造器注入(见上面的 UploadService)。团队协作里建议统一风格,本教程后续示例优先用构造器注入。

敏感信息 ​

Laravel 有 .env 的 .gitignore;Spring Boot 的 application.yml 是会被提交进仓库的(它在 src/main/resources 里)。生产密钥应该用环境变量或外部配置注入,而不是写死在 yml 里:

yaml
spring:
  datasource:
    username: ${DB_USERNAME:root}
    password: ${DB_PASSWORD}

启动时传入:

bash
DB_USERNAME=prod_user DB_PASSWORD=hunter2 java -jar demo.jar

WARNING

永远不要把真实的数据库密码、密钥提交到 Git 仓库,这和 Laravel 的 .env 禁忌是同一个道理。

配置优先级 ​

Spring Boot 的配置有严格优先级(从高到低):

  1. 命令行参数:java -jar demo.jar --server.port=9000
  2. JVM 系统属性 / 环境变量
  3. application-{profile}.yml
  4. application.yml
  5. 内置默认值

所以「命令行参数 > 环境变量 > 配置文件」,「无配置时用默认值」。这个设计让你可以在不改代码的情况下,灵活覆盖任意配置。

面向 PHP / Laravel 开发者的 Spring Boot 中文文档