
本文共 5535 字,大约阅读时间需要 18 分钟。
Spring Boot 配置详解
一、配置文件
1. 配置文件作用
Spring Boot 使用一个全局的配置文件,文件名固定为:
application.properties
application.yml
配置文件的作用是修改 Spring Boot 自动配置的默认值。Spring Boot 在底层都给我们自动配置好了,但我们可以通过配置文件来修改默认值。
2. YAML 语法
YAML(YAML Ain’t Markup Language,缩写为 YAML)是一种标记语言,常用于配置文件。
YAML 的特点
-
YAML 是一种以数据为中心的标记语言,相比 JSON、XML 更适合配置文件。
-
YAML 的配置示例:
server: port: 8081
-
XML 的配置示例(对比 YAML):
8081
3. YAML 配置示例
以下是一些常见的 YAML 配置示例:
# 字面量配置server: port: 8081 path: /hello# 对象配置friends: lastName: zhangsan age: 20# 数组配置pets: - cat - dog - pig# 行内写法pets: [cat, dog, pig]
4. 配置文件值注入
在 Spring Boot 中,可以通过 @Value
或 @ConfigurationProperties
来注入配置文件值。
@Value 和 @ConfigurationProperties 对比
功能 | @ConfigurationProperties | @Value |
---|---|---|
批量注入配置文件属性 | 支持 | 不支持 |
松散绑定 | 支持 | 不支持 |
SpEL 支持 | 不支持 | 支持 |
数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
5. 配置文件注入值
1. properties 配置文件
person: lastName: 张三 age: 18 boss: false birth: 2017/12/12 maps: k1: v1 k2: 12 lists: - lisi - zhaoliu dog: name: 小狗 age: 12
2. JavaBean 统一配置
@Component@ConfigurationProperties(prefix = "person")public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Mapmaps; private List
6. @PropertySource 和 @ImportResource
@PropertySource
-
用于加载指定的配置文件。
@PropertySource(value = { "classpath:person.properties" })@Component@ConfigurationProperties(prefix = "person")class Person { // ...}
@ImportResource
-
用于导入 Spring 的配置文件。
@ImportResource(locations = { "classpath:beans.xml" })
但是,Spring Boot 推荐使用全注解的方式来管理组件。
二、配置文件加载位置
Spring Boot 启动时,会扫描以下位置的 application.properties
或 application.yml
文件:
file:./config/
file:./
classpath:/config/
classpath:/
优先级从高到低,高优先级的配置会覆盖低优先级的配置。
配置文件位置调整
可以通过 spring.config.location
参数来改变默认配置文件位置。
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties
三、自动配置原理
1. 自动配置原理概述
- Spring Boot 启动时,会加载大量的自动配置类。
2. 自动配置类的作用
-
Spring Boot 提供了大量自动配置类,例如:
spring.autoconfigure.enable= true
会自动启用所有相关的自动配置类。
3. 自动配置工作流程
Spring Boot 启动后,会加载 META-INF/spring.factories
文件。
SpringFactoriesLoader 加载所有 jar 包下的 spring.factories
文件。
从 spring.factories
中获取所有启用 @EnableAutoConfiguration
的类。
将这些类加入到 Spring 容器中。
自动配置类会根据条件(@Conditional)决定是否生效。
4. 自动配置示例
以 HttpEncodingAutoConfiguration
为例:
@Configuration@EnableConfigurationProperties(HttpEncodingProperties.class)@ConditionalOnWebApplication@ConditionalOnClass(CharacterEncodingFilter.class)public class HttpEncodingAutoConfiguration { private final HttpEncodingProperties properties; public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) { this.properties = properties; } @Bean @ConditionalOnMissingBean(CharacterEncodingFilter.class) public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); return filter; }}
四、配置文件注入数据校验
可以通过 @Validated
注解来对配置文件注入的值进行数据校验。
@Component@ConfigurationProperties(prefix = "person")@Validatedpublic class Person { @Email private String lastName; @Value("${person.age}") private Integer age; private Boolean boss; private Date birth; private Mapmaps; private List
五、Profile 多环境配置
1. 多 Profile 文件
-
配置文件名称可以是
application-{profile}.properties/yml
。 -
默认使用
application.properties
的配置。
2. YAML 多文档块
server: port: 8081spring: profiles: active: prod---server: port: 8083spring: profiles: dev---server: port: 8084spring: profiles: prod
3. 激活指定 Profile
-
在配置文件中指定:
spring.profiles.active=dev
-
或者通过命令行参数:
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
六、配置文件占位符
1. 随机数占位符
-
配置文件中可以使用以下占位符:
person.last-name=张三${random.uuid}person.age=${random.int}person.birth=2017/12/15
2. 配置文件值获取
-
配置文件中可以使用占位符获取之前配置的值。
person.dog.name=${person.hello:hello}_dog
如果值不存在,可以指定默认值。
七、外部配置加载顺序
Spring Boot 从以下位置加载配置文件,优先级从高到低:
命令行参数
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
Java:comp/env 的 JNDI 属性
Java 系统属性
操作系统环境变量
RandomValuePropertySource 配置的 random.* 属性值
jar 包外部的 application-{profile}.properties
或 application.yml
(带 spring.profile)
jar 包内部的 application-{profile}.properties
或 application.yml
(带 spring.profile)
jar 包外部的 application.properties
或 application.yml
(不带 spring.profile)
jar 包内部的 application.properties
或 application.yml
(不带 spring.profile)
@Configuration 注解类上的 @PropertySource
通过 SpringApplication.setDefaultProperties
指定默认属性
所有支持的配置加载来源。
八、自动配置原理详解
1. 自动配置原理
-
Spring Boot 启动时会自动加载大量的自动配置类。
-
自动配置类通过
@EnableAutoConfiguration
启用。 -
自动配置类会根据条件(@Conditional)决定是否生效。
2. 自动配置工作流程
启用 @EnableAutoConfiguration
会启用所有相关自动配置类。
自动配置类会根据条件(@Conditional)判断是否生效。
自动配置类会给容器中添加组件,并将组件的属性从配置文件中获取。
3. 自动配置示例
以 HttpEncodingAutoConfiguration
为例:
-
加载
HttpEncodingAutoConfiguration
类。 -
检查是否满足
@ConditionalOnWebApplication
和@ConditionalOnClass
的条件。 -
如果满足条件,给容器中添加
CharacterEncodingFilter
组件。 -
组件的属性从
HttpEncodingProperties
类中获取。 -
HttpEncodingProperties
类通过@ConfigurationProperties
与配置文件中的属性绑定。
九、技术总结
-
Spring Boot 的自动配置功能非常强大,可以通过配置文件快速搭建项目。
-
配置文件支持 YAML 和 properties 格式,易于使用。
-
自动配置原理基于
@EnableAutoConfiguration
和@Conditional
注解。 -
在开发项目时,可以通过配置文件灵活配置各种组件的属性。
-
支持多环境配置和占位符,方便项目部署和环境切换。
发表评论
最新留言
关于作者
