SpringBoot配置文件详解

左手的ㄟ右手 2023-10-15 19:47 106阅读 0赞

79621cdb212344a0aa748efe36ced8a2.webp

目录

一、配置文件的作用

二、配置文件的格式

三、properties 配置文件说明

3.1 properties 基本语法

3.2 读取配置⽂件

3.23properties 配置缺点分析

四、yml 配置文件说明

yml 优点分析

4.1 yml 基本语法

4.2 yml 配置简单的数据类型及 null

4.3 yml 配置对象

4.4 yml 配置 list 集合

五、properties 和 yml 的总结

六、Spring Boot 读取配置文件的方法

使用 Environment 读取配置文件

一、配置文件的作用

整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如:

  1. 数据库的连接信息(包含⽤户名和密码的设置);
  2. 项⽬的启动端⼝;
  3. 第三⽅系统的调⽤秘钥等信息;
  4. ⽤于发现和定位问题的普通⽇志和异常⽇志等。

想象⼀下如果没有配置信息,那么 Spring Boot 项⽬就不能连接和操作数据库,甚⾄是不能保存可以⽤于排查问题的关键⽇志,所以配置⽂件的作⽤是⾮常重要的

除了上述的内容,还有很多重要的属性都需要在配置文件中配置。如果想要查看 Spring Boot 更多系统配置项,Spring 的官网中已经整理好了这些信息。链接如下:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties

二、配置文件的格式

Spring Boot 的配置文件主要有两种格式

  1. .properties
  2. .yml

这两个的功能是一样的,但是,这两个是不同时代的产物,properties 相当于老款的配置文件,而 yml 相当于新款的配置文件,要想使用新款的配置文件,在 /src/main/resources 目录下手动创建一个 application.yml 文件就行

要注意的是在创建 Spring Boot 项目时,项目默认会带一个 application.properties 配置文件

924d75ca0a0c45cc8ca03a78c4b6ddc6.png

补充:

  1. 理论上讲 properties 可以和 yml ⼀起存在于⼀个项⽬当中,当 properties 和 yml ⼀起存在⼀个项⽬中时,如果配置⽂件中出现了同样的配置,那么这个时候会以 properties 中的配置为主,也就是 .properties 配置⽂件的优先级最⾼,但加载完 .properties ⽂件之后,也会加载 .yml ⽂件的配置信息。
  2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率)。

三、properties 配置文件说明

properties 配置⽂件是最早期的配置⽂件格式,也是创建 Spring Boot 项⽬默认的配置⽂件

3.1 properties 基本语法

properties 是以键值对的形式配置的,key 和 value 之间用 = 号来连接的。key 就是要配置的属性,value 就是要设置的值。

实例代码:

  1. #配置端口号信息
  2. server.port=8081
  3. #配置数据库信息
  4. spring.datasource.url=jdbc:mysql://localhost:3306
  5. spring.datasource.name=root
  6. spring.datasource.password=123456

3.2 读取配置⽂件

如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解来实现。
@Value 注解使⽤“${}”的格式读取,如下代码所示

  1. package com.example.demo;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.stereotype.Component;
  4. import javax.annotation.PostConstruct;
  5. @Component
  6. public class ReadProperties {
  7. @Value("${server.port}")
  8. private String port;
  9. @PostConstruct
  10. public void doPostConstruct(){
  11. System.out.println("port = "+ port);
  12. }
  13. }

abe223f4c9de443ab379b32182a9e280.png

" class="reference-link">2458b03548694fe5b575344db37f0c6c.png

@Component 在 Spring Boot 启动时候会注⼊到框架中,注⼊到框架中时会执⾏ @PostConstruct初始化⽅法,这个时候就能读取到配置信息了。

3.23properties 配置缺点分析

properties 配置是以 key-value 的形式配置的,如下图所示:
98ef6e7d25be41d899e87ef35bfa403e.png 从上述配置key看出,properties 配置⽂件中会有很多的冗余的信息 ,想要解决这个问题,就可以使⽤ yml 配置⽂件的格式化了

四、yml 配置文件说明

yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语
⾔”。

yml 优点分析

  1. yml 是⼀个可读性⾼,写法简单、易于理解,它的语法和 JSON 语⾔类似。
  2. yml ⽀持更多的数据类型,它可以简单表达清单(数组)、散列表,标量等数据形态。它使⽤空⽩符号缩进和⼤量依赖外观的特⾊,特别适合⽤来表达或编辑数据结构、各种配置⽂件等。
  3. yml ⽀持更多的编程语⾔,它不⽌是 Java 中可以使⽤在 Golang、PHP、Python、Ruby、JavaScript、Perl 中

4.1 yml 基本语法

yml 是树型结构的配置文件,它的基础形式是 key: value,yml 的基础语法具有以下的规则:

  • key: value 表示键值对关系,冒号后面必须有一个空格
  • 使用空格的缩进表示层级关系,空格数目不重要,只要是左对齐的一列数据,都是同一个层级的
  • 大小写敏感

" class="reference-link">f06172a626254b87a1a994be4b671370.png

其中第⼀项的配置为正确的,key 也是⾼亮显示的,⽽第⼆项没有空格是错误的使⽤⽅式,第⼆项的key 也没有⾼亮显示。

配置数据库示例:

3fe3edf5e5e7476ea0e32f709a96e005.png

4.2 yml 配置简单的数据类型及 null

yml 配置:

  1. #字符串
  2. string:
  3. value: hello zifuchuan
  4. #整型
  5. int:
  6. value: 10
  7. #布尔类型
  8. boolean:
  9. value: tru

读取代码: 通过 @Value 注解来读取配置中的简单数据类型和 null

  1. package com.example.demo;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. @RestController
  6. public class ReadYml {
  7. @Value("${int.value}")
  8. private int val;
  9. @Value("${string.value}")
  10. private String val2;
  11. @Value("${boolean.value}")
  12. private boolean val3;
  13. @RequestMapping("/read")
  14. public void read(){
  15. System.out.println("整数 =>"+ val);
  16. System.out.println("字符串 =>"+ val2);
  17. System.out.println("布尔类型 =>"+ val3);
  18. }
  19. }

312f9eff9be946e881941ea87827acd9.png

在 yml 中,字符串如果使用了双引号包裹,那么特殊字符是不会转义的,比如 \n 就表示换行;而如果字符串什么都不包裹或者用单引号包裹,那么特殊字符就会自动进行转义。

4.3 yml 配置对象

yml 配置:

  1. #写法一
  2. student:
  3. id: 1
  4. name: 竹筒
  5. age: 250
  6. #写法二
  7. user: {id: 2, username: 小白, age: 2}

读取代码:

首先需要创建一个匹配配置文件中对象的类,并且读取配置文件中的对象就不能使用 @Value 注解,而需要使用 @ConfigurationProperties 注解,该注解放在创建的类上,并且有一个 prefix 属性用于设置配置文件中对应的 key。创建的类中必须要有 Setter 和 Getter 方法。

  1. package com.example.demo;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.stereotype.Component;
  4. @Component
  5. @ConfigurationProperties(prefix = "student")
  6. public class Student {
  7. private int id;
  8. private String name;
  9. private int age;
  10. @Override
  11. public String toString() {
  12. return "Student{" +
  13. "id=" + id +
  14. ", name='" + name + '\'' +
  15. ", age=" + age +
  16. '}';
  17. }
  18. public int getId() {
  19. return id;
  20. }
  21. public void setId(int id) {
  22. this.id = id;
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. public int getAge() {
  31. return age;
  32. }
  33. public void setAge(int age) {
  34. this.age = age;
  35. }
  36. }

通过创建的类读取到配置文件的对象后,将该类注册到 Spring 容器中,当使用时,直接通过 @Autowired 或者 @Resource 注解注入就好。

  1. package com.example.demo;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class ReadYml {
  8. @Autowired
  9. private Student student;
  10. @RequestMapping("/student")
  11. public void stu(){
  12. System.out.println(student.toString());
  13. }
  14. }

dca50e4595144b54b8e830e29aa0d17e.png

4.4 yml 配置 list 集合

yml 配置:

  1. #集合写法一
  2. list:
  3. animal6:
  4. -
  5. -
  6. -
  7. #集合写法二
  8. list2: {fruit: [苹果,香蕉,西瓜]}

读取代码:

yml 配置集合时,也需要通过 @ConfigurationProperties 注解来读取,该注解的 prefix 属性对应着上述 yml 配置的 dbtypes1 或者 dbtypes2。接下来创建一个匹配配置文件中集合的类

千万注意(private List animal6**;) 这块配置的名字必须与yml中对应**ee2202bcafe1427194d566a423fd47ce.png

  1. package com.example.demo;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.stereotype.Component;
  4. import java.util.List;
  5. @Component
  6. @ConfigurationProperties(prefix = "list")
  7. public class ListObjec {
  8. private List<String> animal6;
  9. public List<String> getAnimal6() {
  10. return animal6;
  11. }
  12. public void setAnimal6(List<String> animal6) {
  13. this.animal6 = animal6;
  14. }
  15. }

通过创建的类读取到配置文件的对象后,将该类注册到 Spring 容器中,当使用时,直接通过 @Autowired 或者 @Resource 注解注入就好。

  1. package com.example.demo;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import javax.annotation.Resource;
  6. @RestController
  7. public class ReadYml {
  8. @Resource
  9. private ListObjec listo;
  10. @RequestMapping("/list")
  11. public void lis() {
  12. System.out.println("集合为= " + listo.getAnimal6());
  13. }
  14. }

28c84ac8564c4313b446fee2f185224e.png

五、properties 和 yml 的总结

  1. properties 是以 key=value 的形式配置的键值类型的配置⽂件,⽽ yml 使⽤的是类似 json 格式的 树形配置⽅式进⾏配置的,yml 层级之间使⽤换⾏缩进的⽅式配置,key 和 value 之间使⽤“: ”英⽂ 冒号加空格的⽅式设置,并且空格不可省略。
  2. properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使⽤ yml 可以很好的 解决数据冗余的问题。
  3. yml 通⽤性更好,⽀持更多语⾔,如 Java、Go、Python 等,如果是云服务器开发,可以使⽤⼀份 配置⽂件作为 Java 和 Go 的共同配置⽂件。
  4. yml 虽然可以和 properties 共存,但⼀个项⽬中建议使⽤统⼀的配置类型⽂件。
  5. yml 支持更多的数据类型

六、Spring Boot 读取配置文件的方法

  • 使用 @Value 读取配置文件
  • 使用 @ConfigurationProperties 读取配置文件
  • 使用 Environment 读取配置文件

前两种上面已经使用过 下面我们来测试一下第三种

Environment 是 Spring Core 中的一个用于读取配置文件的类,将此类使用 @Autowired 或者 @Resource 注入到类中就可以使用它的 getProperty 方法来获取某个配置项的值,代码如下所示:

使用 Environment 读取配置文件

yml配置

  1. #写法一
  2. student:
  3. id: 1
  4. name: 竹筒
  5. age: 250

读取代码:

  1. @Autowired
  2. private Environment environment;
  3. @RequestMapping("/readE")
  4. public void read3(){
  5. System.out.println(environment.getProperty("student.name"));
  6. }

63daa8ce4121472c9ccbca1cca3b6760.png


以上就是我对SpringBoot配置文件的理解 ,如有错误还请指出

65c3a97a379e4bef949cdfbda89d3b7d.webp

发表评论

表情:
评论列表 (有 0 条评论,106人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SpringBoot 配置文件详解

      springboot采纳了建立生产就绪spring应用程序的观点。 Spring Boot优先于配置的惯例,旨在让您尽快启动和运行。在一般情况下,我们不需要做太多的配置就能