2、Spring Boot核心配置:配置文件详解

配置,是Spring Boot的灵魂。我见过太多新手,上来就写代码,结果部署时被环境问题搞得焦头烂额。说白了,配置搞不定,项目跑不起来。今天咱们就把这块彻底吃透。

2.1 配置文件:application.properties vs application.yml

Spring Boot支持两种配置文件格式:application.propertiesapplication.yml。我个人习惯用YAML,因为它层次清晰,看着舒服。但有些老项目还在用properties,也完全没问题。

properties格式示例:

server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456

YAML格式示例:

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: 123456
我的建议:团队协作时统一用一种格式。YAML对缩进敏感,别用Tab,用空格。我曾经见过有人混用,结果配置死活加载不上,排查了半天。

2.2 多环境配置:开发、测试、生产

实际项目中,开发、测试、生产环境的配置肯定不一样。数据库地址、日志级别、缓存策略,这些都得分开。Spring Boot提供了多环境配置机制,非常优雅。

命名规则很简单:application-{profile}.propertiesapplication-{profile}.yml

举个例子:

  • application-dev.yml — 开发环境
  • application-test.yml — 测试环境
  • application-prod.yml — 生产环境

然后在主配置文件里指定激活哪个环境:

# application.yml
spring:
  profiles:
    active: dev

启动时也可以动态指定:

java -jar myapp.jar --spring.profiles.active=prod
注意:千万别把生产环境的密码硬编码在配置里!我曾经接手过一个项目,数据库密码直接写在application-prod.yml里,还提交到了Git仓库。那叫一个酸爽。建议用环境变量或配置中心。

2.3 配置优先级:谁说了算?

当多个地方都有同一个配置项时,到底听谁的?Spring Boot有一套明确的优先级规则。我整理了一张表,你一看就明白:

优先级(高→低) 配置来源 说明
1 命令行参数 --server.port=9090
2 JNDI属性 java:comp/env
3 系统环境变量 SPRING_APPLICATION_JSON
4 application-{profile}.properties 特定环境的配置
5 application.properties 默认配置
6 @PropertySource 自定义配置文件

为什么会这样设计?说白了,就是为了灵活。你想想看,开发时用默认配置,测试时用环境变量覆盖,生产时用命令行参数微调。一套代码,到处运行。

避坑指南:我曾经在Docker部署时,明明在application-prod.yml里配了端口,结果容器启动后端口不对。后来才发现,Dockerfile里传了环境变量,优先级更高。记住:环境变量 > 配置文件。

2.4 自定义配置:把控制权握在自己手里

框架提供的配置项毕竟有限。很多时候,我们需要自定义配置。比如业务参数、第三方接口地址、开关标识等。Spring Boot提供了两种方式:

方式一:@Value注解

# application.yml
app:
  name: 我的项目
  version: 1.0.0
  upload-path: /data/uploads
@Component
public class AppConfig {
    @Value("${app.name}")
    private String appName;

    @Value("${app.version}")
    private String version;

    @Value("${app.upload-path}")
    private String uploadPath;
}

方式二:@ConfigurationProperties(推荐)

@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {
    private String name;
    private String version;
    private String uploadPath;

    // getter/setter 省略
}

我个人强烈推荐第二种。为什么?因为类型安全。你想想看,用@Value的话,每个字段都得写一遍注解,而且类型转换容易出问题。用@ConfigurationProperties,Spring Boot会自动帮你做类型转换和校验。

小技巧:配合@Validated注解,还可以做参数校验。比如上传路径不能为空、版本号必须符合正则等。我一般在微服务项目里,把公共配置抽成一个单独的配置类,方便复用。

2.5 配置文件的加载顺序

Spring Boot启动时,会按以下顺序加载配置文件:

  1. 项目根目录下的config子目录
  2. 项目根目录
  3. classpath下的config
  4. classpath根目录

后加载的会覆盖先加载的。这个顺序有什么用?举个例子:你可以在jar包外面放一个config/application.yml,这样部署时不用重新打包,直接改外部配置就行。我在生产环境就是这么干的,运维同事直呼方便。

注意:如果你用了spring.config.location指定外部配置路径,那默认的加载顺序就失效了。这个参数会完全替换默认路径,而不是追加。

2.6 随机值与占位符

Spring Boot支持在配置里使用随机值和占位符,挺实用的。

# 随机值
my:
  secret: ${random.value}
  number: ${random.int}
  uuid: ${random.uuid}

# 占位符引用
app:
  full-name: ${app.name}-${app.version}

随机值在测试场景下特别好用。比如生成随机端口,避免冲突。占位符则能减少重复配置,让配置更整洁。

2.7 总结一下

配置管理看似简单,但坑不少。记住几个要点:

  • 统一用YAML或properties,别混用
  • 多环境配置用profile,别手动改配置
  • 敏感信息用环境变量或配置中心
  • 自定义配置用@ConfigurationProperties
  • 外部配置优先于内部配置

嗯,这一章就到这里。下一章咱们聊聊日志配置,那也是生产环境必备的技能。