SpringBoot配置文件详解
SpringBoot配置文件详解
1. 热部署配置
Spring Boot提供了spring-boot-devtools
模块来支持热部署,提高开发效率:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional>
</dependency>
使用方式:修改Java代码或配置文件后,按Ctrl+F9
即可实现热部署。
2. 配置文件基础
Spring Boot支持两种全局配置文件:
application.properties
application.yml
YAML简介
YAML(YAML Ain't Markup Language)是一种以数据为中心的配置文件格式,比JSON和XML更适合做配置。
YAML基本语法:
- 使用
k:(空格)v
表示键值对(空格必须有) - 使用空格缩进控制层级关系
- 属性和值大小写敏感
值写法:
- 字面量(数字、字符串、布尔)
- 字符串默认不加引号
""
:双引号,不转义特殊字符''
:单引号,转义特殊字符
- 对象/Map:使用缩进表示层级
- 数组:使用
-
表示元素
3. 配置文件值注入
3.1 基本注入方式
导入配置文件处理器,提供配置提示:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional>
</dependency>
3.2 @Value vs @ConfigurationProperties
特性 | @Value | @ConfigurationProperties |
---|---|---|
功能 | 单个注入 | 批量注入 |
松散绑定 | 不支持 | 支持 |
SpEL表达式 | 支持 | 不支持 |
复杂类型封装 | 不支持 | 支持 |
数据校验 | 不支持 | 支持 |
3.3 数据校验示例
@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {@Emailprivate String lastName;private Integer age;private Boolean boss;private Date birth;private Map<String,Object> maps;private List<Object> lists;private Dog dog;// getters/setters
}
3.4 相关注解
@PropertySource
:加载指定配置文件@ImportResource
:导入Spring配置文件@Bean
:替代XML配置方式
推荐配置方式:
@Configuration
public class MyAppConfig {@Beanpublic HelloService helloService(){return new HelloService();}
}
4. 配置文件高级特性
4.1 占位符
person.last-name=张三${random.uuid}
person.age=${random.int}
person.dog.name=${person.hello:hello}_dog
支持:
- 随机数:
${random.value}
,${random.int}
,${random.int(10)}
- 默认值:
${key:defaultValue}
4.2 Profile配置
多Profile文件:
application-{profile}.properties/yml
yml多文档块:
server:port: 8081
spring:profiles:active: dev
---
server:port: 8082
spring:profiles: dev
激活方式:
- 配置文件中指定:
spring.profiles.active=dev
- 命令行:
--spring.profiles.active=dev
- 虚拟机参数:
-Dspring.profiles.active=dev
4.3 配置文件加载位置
Spring Boot会从以下位置加载配置文件(优先级从高到低):
file:./config/
file:./
classpath:/config/
classpath:/
高优先级配置会覆盖低优先级配置,所有配置会形成互补。
4.4 外部配置加载顺序
- 命令行参数
- JNDI属性
- Java系统属性
- 操作系统环境变量
- 随机属性
- jar包外部的profile配置文件
- jar包内部的profile配置文件
- jar包外部的默认配置文件
- jar包内部的默认配置文件
@PropertySource
- 默认属性
5. 自动配置原理
5.1 工作原理
- SpringBoot启动时加载主配置类,启用自动配置功能
@EnableAutoConfiguration
- 通过
EnableAutoConfigurationImportSelector
导入组件 - 扫描
META-INF/spring.factories
中配置的自动配置类 - 每个自动配置类根据条件决定是否生效
- 生效的配置类向容器中添加组件,组件属性从
xxxxProperties
类获取
5.2 条件注解
注解 | 说明 |
---|---|
@ConditionalOnJava | 系统Java版本是否符合要求 |
@ConditionalOnBean | 容器中存在指定Bean |
@ConditionalOnMissingBean | 容器中不存在指定Bean |
@ConditionalOnClass | 系统中有指定的类 |
@ConditionalOnMissingClass | 系统中没有指定的类 |
@ConditionalOnProperty | 系统中指定的属性是否有指定值 |
5.3 调试自动配置
设置debug=true
查看自动配置报告:
debug=true
报告会显示:
- 匹配成功的自动配置类(Positive matches)
- 未匹配的自动配置类(Negative matches)
- 排除的自动配置类(Exclusions)
6. 最佳实践
- 使用YAML作为配置文件格式,结构更清晰
- 业务配置使用
@ConfigurationProperties
批量绑定 - 简单属性可以使用
@Value
注入 - 生产环境和开发环境使用不同的Profile配置
- 自定义配置应放在
application.yml
中,不要修改自动配置类的默认配置 - 复杂配置推荐使用JavaConfig方式(
@Configuration
+@Bean
)