配置中心
Laravel 用
.env文件 +config/目录管理配置;Spring Boot 用application.yml(或application.properties)一个文件搞定,并支持「按环境拆分」和「类型安全配置类」。
配置文件在哪
src/main/resources/ 下的:
application.properties(默认生成,key=value风格)application.yml(推荐,层级缩进风格,更接近人脑思考)
两种格式等价,推荐 YAML。用 application.yml 时把 .properties 删掉即可:
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 写法是扁平的:
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 --portspring.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)# application.yml
spring:
profiles:
active: dev # 相当于 APP_ENV=dev# application-dev.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo_dev也可以用 --spring.profiles.active=prod 启动参数覆盖,这在 Docker 部署时很常用(见 部署)。
读取配置:三种方式
1. @Value —— 像 env('KEY')
@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 绑定成强类型字段:
# application.yml
app:
name: demo
upload-dir: /data/uploads
max-size: 100MBpackage 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;
}然后在任何地方注入使用:
@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 —— 偶尔用
@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 里:
spring:
datasource:
username: ${DB_USERNAME:root}
password: ${DB_PASSWORD}启动时传入:
DB_USERNAME=prod_user DB_PASSWORD=hunter2 java -jar demo.jarWARNING
永远不要把真实的数据库密码、密钥提交到 Git 仓库,这和 Laravel 的 .env 禁忌是同一个道理。
配置优先级
Spring Boot 的配置有严格优先级(从高到低):
- 命令行参数:
java -jar demo.jar --server.port=9000 - JVM 系统属性 / 环境变量
application-{profile}.ymlapplication.yml- 内置默认值
所以「命令行参数 > 环境变量 > 配置文件」,「无配置时用默认值」。这个设计让你可以在不改代码的情况下,灵活覆盖任意配置。