SpringBoot - 配置文件application.yml

1,085 阅读2分钟

1 基本介绍

(1)YAML是 JSON 的超集,简洁而强大,是一种专门用来书写配置文件的语言,可以替代 application.properties。

(2)在创建一个 SpringBoot 项目时,引入的 spring-boot-starter-web 依赖间接地引入了 snakeyaml 依赖, snakeyaml 会实现对 YAML 配置的解析。

(3)YAML 的使用非常简单,利用缩进来表示层级关系,并且大小写敏感。

1.1 YAML 配置与properties配置的比较

  • 可以使用 @PropertySource 注解加载自定义的 Properties 配置文件,但无法加载自定义的 YAML 文件。
  • YAML 支持列表的配置,而 Properties 不支持。

1.2 常规配置

  • 在 Spring Boot 项目中使用 YAML 只需要在 resources 目录下创建一个 application .yml 文件即可,这里我们添加如下配置:
server:
  port: 8081
  servlet:
    context-path: /hangge
  tomcat:
    uri-encoding: utf-8
  • 配置属性之间也可以相互引用使用:
my:
  name: 航歌
  age: 100
  info: name:${my.name} age:${my.age}
  • 配置文件中可以使用 ${random} 来生成各种不同类型的随机值:
my:
  secret: ${random.value}
  number: ${random.int}
  bignumber: ${random.long}
  uuid: ${random.uuid}
  lessthanten: ${random.int(10)}
  numberinrange: ${random.int[1024,65536]}

1.3 将数据注入到属性上

  • 假设我们有如下配置数据:
my:
  name: 航歌
  age: 100
  • 在需要的地方我们使用 @Value 注解就可以将数据注入到属性上:

@RestController

public class HelloController {

    ``@Value``(``"${my.name}"``)

    ``String name;

    ``@GetMapping``(``"/hello"``)

    ``public String hello() {

        ``return "welcome to " + name;

    ``}

}

1.4 将数据注入到Bean中

有时候属性太多了,一个个绑定到属性字段上太累,官方提倡绑定一个对象的 bean。

 

(1)首先我们创建一个名为 My 的 Bean,并将前面的配置数据注入到这个 Bean 中。

  1. @ConfigurationProperties 中的 prefix 属性描述了要加载的配置文件的前缀。
  2. Spring Boot 采用了一种宽松的规则来进行属性绑定: 假设 Bean 中的属性名为 authorName,那么配置文件中的属性可以是 my.author_name、my.author-name、my.authorName 或者 my.AUTHORNAME

@Component

@ConfigurationProperties``(prefix = ``"my"``)

public class My {

    ``private String name;

    ``private String age;

    ``public String getName() {

        ``return name;

    ``}

    ``public void setName(String name) {

        ``this``.name = name;

    ``}

    ``public String getAge() {

        ``return age;

    ``}

    ``public void setAge(String age) {

        ``this``.age = age;

    ``}

} (2)然后我们在 Controller 中引入这个 Bean 使用即可: @RestController

public class HelloController {

    ``@Autowired

    ``My my;

    ``@GetMapping``(``"/hello"``)

    ``public String hello() {

        ``return my.getName() + ``" : " + my.getAge();

    ``}

}