众所周知 Spring Boot 的核心:约定大于配置。这句话用于 Spring Boot 时可以从如下两点来理解:
开发人员仅需规定应用中不符约定的部分。
在没有规定配置的地方,采用默认配置,以力求最简配置为核心思想。
其实,总的来讲,上面这两条都遵循了推荐默认配置的思想;当存在特殊需求时候,自定义下配置即可。定义些默认配置办不到的需求即可,剩下的配置,默认就帮助你完成,大大减少配置工作,这就是所谓的 “约定”。
既然推荐使用默认配置,那么在项目中就肯定存在大量的配置(此外还内置了一个习惯性的配置,让你无需手动进行配置),以让你的项目快速运行起来。所以,我们要想把 Spring Boot 玩的溜,就要懂得如何开启各个功能模块的默认配置,这就需要清楚 Spring Boot 的配置文件 src/main/java/resources/application.yml(若不存在,请自行创建)。
Spring Boot 默认的全局配置文件有四类,按加载的先后顺序分别是:application.properties、application.xml、application.yml、application.yaml,若存在相同的属性名,则以前者的值为准。(Spring官方推荐使用的格式是 .yml 格式,目前官网实例都是使用 yml 格式进行配置讲解的)应用启动时会自动加载此文件,无需手动引入。
一、自定义属性
在 application.yml 自定义一组属性:
student:
name: 李四
age: 20
即可使用 @Value(“student.name”)
为成员变量注入值。但当自定义属性很多时就需要注入很多次,Spring Boot 提供了基于类型安全的配置方式 @ConfigurationProperties
将配置文件中的属性和一个 Bean 的属性关联,从而实现类型安全的配置。
@ConfigurationProperties(prefix = "student")
public class StudentProperties {
/**
* 姓名,默认为:张三
*/
private String name = "张三";
/**
* 年龄,默认为:18
*/
private Integer age = 18;
// 省略 getter、setter
}
上述做法仅把配置信息封装到的 StudentProperties
实体类中,还并没有真正成为 Bean。
@Configuration
@EnableConfigurationProperties(StudentProperties.class)
public class StudentAutoConfiguration {
private final StudentProperties props;
public StudentAutoConfiguration(StudentProperties props) {
this.props = props;
}
}
完成上述做法,就真正把 StudentProperties 实例交给了 Spring 管理,即 Spring Bean。即可继续在本类中通过使用 StudentProperties 实例的属性值构建其他 Bean,亦可在其他 Bean 中直接注入 StudentProperties 实例。
还有一种实现上述功能的方式则是:
@Component
@ConfigurationProperties(prefix = "student")
@EnableConfigurationProperties(StudentProperties.class)
public class StudentProperties {
private String name = "张三";
private Integer age = 18;
// 省略 getter、setter
}
下表为两个注解的区别。
@ConfigurationProperties | @Value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
二、变更默认属性值
既然要变更默认属性的值,那么就需要知道该默认属性名才行,否则就不存在所谓的变更一说了。搭建 Spring Boot 项目时,会引入 org.springframework.boot:spring-boot-starter 包,该包依赖了 spring-boot-autoconfigure 包,顾名思义,该包内肯定存在大量的 @EnableConfigurationProperties,可直接到该包下获取属性名。
值得一提的是,我们常在 application.properties 文件中变更某属性值时,仅才输入属性名的一部分,开发工具会自动联想出与之相关的所有的属性,如下图示例:
其实质是通过加载 META-INF/spring-configuration-metadata.json 描述文件来提示与之相关的属性名及其默认值。当自定义属性时,可通过依赖以来如下jar包,编译后自动生成该描述文件。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
三、自定义配置文件
虽然 Spring Boot 为我们提供了application 配置文件,但实际上很多时候我们却会自定义配置文件,这些文件就需要我们进行手动加载,SpringBoot 是不会自动识别这些文件的,所以还需要在上述基础上再添加一步:
@ConfigurationProperties(prefix = "student")
@PropertySource("classpath:config/student.yml")
public class StudentProperties {
// 省略
}
表示在 resources 下自定义了一个 config/student.yml 配置文件。
四、属性引用
可通过使用 SpEL 表达式来完成属性值的引用,例如:
student:
name: 李四
age: 20
detail: ${student.name}-${student.age}
五、随机数
配置文件中 ${random} 可以用来生成各种不同类型的随机值,从而简化了代码生成的麻烦,例如 生成 int 值、long 值或者 string 字符串。
demo:
secret: ${random.value}
number: ${random.int}
bignumber: ${random.long}
uuid: ${random.uuid}
number:
less:
than:
ten: ${random.int(10)}
in:
range: ${random.int[1024, 65536]}