0%

Spring Boot 配置

3 配置

Spring Boot 使用一个全局的配置文件,配置文件的文件名是固定的。

  • application.properties
  • application.yml

配置文件用来修改 Spring Boot 配置的默认值。

例:

1
2
server:
port: 8000

如果是 xml,可能是这么写的:

1
2
3
<server>
<port>8000</port>
</server>

很明显 yml 配置更简洁。

3.1 YAML

YAML(YAML Ain’t Markup Language):

.yml 是 YAML 语言的文件,以数据为中心,比 json、xml 等更适合做配置文件。

语法:

k: v 表示键值对。冒号后必须有空格。

用缩进来控制层级关系,只要是左对齐的一列数据,就是同一层级的。

大小写敏感。

值的写法:

字面量:数字,字符串,布尔。

​ 字符串:

​ “”:双引号中会转义字符。

​ ‘’:单引号中不会转义字符,\n 输出还是 \n。

对象、map(属性和值):

1
2
3
person:
name: zhangsan
age: 20

或:

1
person: {name: zhangsan,age: 20}

数组(list,set):

1
2
3
4
pets:
- cat
- dog
- pig

或:

1
pets: [cat,dog,pig]

在 SpringBoot 中使用配置文件值注入:

yaml:

1
2
3
4
5
6
7
8
9
10
11
12
Person:
name: bob
age: 20
boss: false
birth: 2000/12/12
map: {k1: v1,k2: 12}
lists:
- john
- jack
dog:
name: 金毛
age: 2

Bean:

1
2
3
4
5
6
7
8
9
10
11
12
@Component
@ConfigurationProperties(prefix="person")
public class Person {
private String Name;
private Integer age;
private Boolean boss;
private Date birth;

private Map<String,Object> map;
private List<Object> lists;
private Dog dog;
}

配置了注解之后,idea 提示添加依赖,帮助自动生成配置文件和 Bean 的匹配:

1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

之后在单元测试中输出Person,会得到配置文件中注入的数值。

如果配置文件中出现中文乱码,在 file Encoding 设置中选择UTF-8,勾选后面的选项。(IDEA)

3.2 @Value获取值和@ConfigurationProperties获取值比较

@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型封装(如map) 支持 不支持

松散绑定:指person-name能与perisonName绑定

JSR303数据校验:例如在属性前加@Email注解,可以判断配置文件中传入的值是否符合邮箱规则。

3.3 @PropertySource与@ImportResource

@PropertiesSource:读取指定配置文件。放在bean定义前。

@ImportResource:导入Spring配置文件,让配置文件中的内容生效。SpringBoot中没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别,想让Spring的配置文件生效,就把这个注解标注在一个配置类上。

SpringBoot推荐给容器中添加组件的方式:使用全注解的方式。写配置类。

1
2
3
4
5
6
7
@Configuration
public class MyConfig{
@Bean // 将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名。
public HelloService helloService(){
return new HelloSrvice();
}
}

3.4 配置文件占位符

3.4.1 随机数

1
person.age=${random.int}

3.4.2 占位符

获取之前配置的值,如果没有可以用:指定默认值。

1
person.dog.name=${person.name:Jack}+Dog

3.5 Profile

SpringBoot提供了项目在不同环境下运行时,快速切换配置文件的方法。

3.5.1 yaml文档块方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
servcer:
port: 8081
spring:
profiles:
active: dev
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: pord

上面这段配置使用的是dev模式,端口8082。

3.5.2 多profile文件

不同环境的配置文件命名为:application-dev.properties 或 application-prod.properties。

在application.properties中配置 spring.profiles.active=dev 以切换配置。

还可以使用命令行方式激活:在运行设置,program arguments 中如下设置。

1
--spring.profiles.active=dev

3.6 配置文件加载位置

SpringBoot 会扫描以下位置的 application.properties 或者 application.yml 文件u欧维SpringBoot的默认配置文件。

  • file:./config/
  • file:./
  • classpath:/config/
  • classpath:/

以上按照优先级从高到低排序,所有位置的配置文件都会被加载,高优先级的配置文件内容会覆盖低优先级。

也可以通过配置 spring.config.location 来改变默认配置。如果一些配置高优先级没有,而低优先级有,则此配置依然会生效。

3.7 自动配置原理

[配置文件能配置的属性] https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#common-application-properties

  1. SpringBoot启动时加载大量自动配置类。
  2. 我们看我们需要的功能有没有SpringBoot写好的自动配置类。
  3. 再来看这个自动配置类中到底配置了那些组件。
  4. 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。这样就可以在配置文件中指定这些属性的值。

@Conditional派生注解:必须是@Conditional指定的条件成立,才给容器中添加组件,配置内容才生效。

通过设置debug=true属性来让控制台打印自动控制报告。