2、Spring Boot核心配置:配置文件详解
配置,是Spring Boot的灵魂。我见过太多新手,上来就写代码,结果部署时被环境问题搞得焦头烂额。说白了,配置搞不定,项目跑不起来。今天咱们就把这块彻底吃透。
2.1 配置文件:application.properties vs application.yml
Spring Boot支持两种配置文件格式:application.properties和application.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
2.2 多环境配置:开发、测试、生产
实际项目中,开发、测试、生产环境的配置肯定不一样。数据库地址、日志级别、缓存策略,这些都得分开。Spring Boot提供了多环境配置机制,非常优雅。
命名规则很简单:application-{profile}.properties或application-{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
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启动时,会按以下顺序加载配置文件:
- 项目根目录下的
config子目录 - 项目根目录
- classpath下的
config包 - 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
- 外部配置优先于内部配置
嗯,这一章就到这里。下一章咱们聊聊日志配置,那也是生产环境必备的技能。