Fork me on GitHub

SpringBoot系列文章(SpringBoot项目中配置文件总结)

目录

  • 背景
  • 第一部分 开发环境准备
  • 第二部分 使用Maven构建项目
  • 第三部分 项目目录结构
  • 第四部分 编写HelloWorld项目
  • 参考文献及资料

背景

第一部分 配置文件

在使用Spring Initializer快速创建SpringBoot项目时,会在resources目录下给我们一个默认的空的全局配置文件 application.properties。配置文件的作用也正是用来修改SpringBoot自动配置的默认值。

配置文件名是固定的,SpringBoot使用一个全局配置文件application.properties或者application.yml(或者yaml)。这两个文件本质是一样的,区别只是其中的语法略微不同。

application.yml 配置文件使用YMAL语言,YMAL不是如XML般的标记语言,以数据为中心,更适合作为配置文件。

YAML:

1
2
server:
port: 8081

XML:

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

第二部分 YAML语法

2.1 基本语法

  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  • 大小写敏感

k:(空格)v——表示一对键值对(空格必须有)。以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一个层级的。

1
2
3
server:
port: 8081
path: /hello

格式校验可以使用在线工具:https://www.bejson.com/validators/yaml_editor/

2.2 写法

(1)字面量

字面量:普通的值(数字,字符串,布尔,日期 )

k: v——字面直接书写

  • 字符串默认不用加上单引号或者双引号
1
name: zhangsan

"":双引号,不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思

1
name: "zhangsan \n lisi"

输出:

1
2
zhangsan
lisi

'':单引号,会转义特殊字符,特殊字符最终只是一个普通的字符串数据

1
name: 'zhangsan \n lisi'

输出:

1
zhangsan \n lisi

(2)对象、Map(属性和值)(键值对)

k: v——在下一行来写对象的属性和值的关系(注意缩进)

1
2
3
friends:
lastName: zhangsan
age: 20

行内写法:

1
friends: {lastName: zhangsan,age: 18}

(3)数组(List、Set)

- 值表示数组中的一个元素

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

行内写法

1
pets: [cat,dog,pig]

第三部分 配置文件的注入

3.1 配置文件书写

(1)yaml配置文件

配置文件application.yml

1
2
3
4
5
6
7
8
9
10
11
12
person:
lastName: zhangsan
age: 20
boss: false
birth: 2020/10/10
maps: {k1: v1,k2: 15}
lists:
- lisi
- wangwu
dog:
name: 狗狗
age: 5

(2)properties配置文件

或者application.properties

1
2
3
4
5
6
7
8
9
person.last-name=张三
person.age=20
person.birth=2020/10/10
person.boss=true
person.maps.k1=v1
person.maps.k2=15
person.lists=lisi,wangwu
person.dog.name=狗狗
person.dog.age=5

3.2 属性注入

(1)@ConfigurationProperties

JavaBean:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中。
* @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定。
* prefix = "person":与配置文件中person下面的所有属性一一映射
*
* 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能。
*
*/
@Component
@ConfigurationProperties(prefix = "person")
@Validated
@Data
public class Person {
@NotNull //JSR303数据校验
private String LastName;
private String age;
private boolean boss;
private Date birthday;

private Map<String,Object> maps;//复杂类型封装
private List<Object> lists;
private Dog dog;
}

导入配置文件处理器,配置文件进行绑定就会有提示:

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

编写测试方法:

1
2
3
4
5
6
7
8
9
10
11
@RunWith(SpringRunner.class)
@SpringBootTest
class SpringbootConfigApplicationTests {
@Autowired
Person person;

@Test
void test01() {
System.out.println(person);
}
}

输出结果:

1
Person(LastName=zhangsan, age=20, boss=false, birthday=Sat Oct 10 00:00:00 CST 2020, maps={k1=v1, k2=15}, lists=[lisi, wangwu], dog=Dog(name=狗狗, age=5))

(2)@Value

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Component
@Data
public class Person {

/**
* <bean class="Person">
* <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
* <bean/>
*/
@Value("${person.last-name}")
private String lastName;
@Value("#{11*2}")//SpEL
private Integer age;
@Value("true")
private Boolean boss;
@Value("2020/10/10")
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}

输出结果:

1
Person(LastName=张三, age=22, boss=true, birthday=Fri Oct 10 00:00:00 CST 1997, maps=null, lists=null, dog=null)

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

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

不论配置文件yml还是properties他们都能获取到值。

在某个业务逻辑中需要获取配置文件中的某项值——使用@Value;专门编写了一个JavaBean来和配置文件进行映射——使用@ConfigurationProperties。

第四部分 配置文件占位符

第六部分 多环境配置Profile

以上都不是重点,这才是重点,这才是重点,这才是重点,重要的事情说3遍。我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发、测试、生产等。其中每个环境的数据库地址、服务器端口等等配置都会不同,如果在为不同环境打包时都要频繁修改配置文件的话,那必将是个非常繁琐且容易发生错误的事。
对于多环境的配置,各种项目构建工具或是框架的基本思路是一致的,通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包,Spring Boot也不例外,或者说更加简单。
在Spring Boot中多环境配置文件名需要满足 application-{profile}.properties 的格式,其中 {profile} 对应你的环境标识,比如:
application-dev.properties:开发环境
application-test.properties:测试环境
application-prod.properties:生产环境
至于哪个具体的配置文件会被加载,需要在 application.properties 文件中通过 spring.profiles.active 属性来设置,其值对应 {profile} 值。
如: spring.profiles.active=test 就会加载 application-test.properties 配置文件内容
下面,以不同环境配置不同的服务端口为例,进行样例实验。

第七部分 配置文件加载位置

第八部分 外部配置加载顺序

第九部分 自动配置原理

参考文献及资料

1、Spring官网,链接:https://juejin.cn/post/6844904186539147271

本文标题:SpringBoot系列文章(SpringBoot项目中配置文件总结)

文章作者:rong xiang

发布时间:2020年01月11日 - 13:01

最后更新:2022年10月25日 - 23:10

原始链接:https://zjrongxiang.github.io/posts/cda2519d/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%