Spring Boot: Yaml配置文件 以及 @ConfigurationProperties属性获取

时间:2023-01-15 00:12:31

Yaml配置文件

概述

Spring Boot在支持application.properties配置文件的同时,也支持application.yaml配置文件.
配置文件中的属性,可以通过:

  • 通过@Value注解将属性值注入Bean中;
  • 通过@ConfigurationProperties注解将属性值注入Bean中.

此处不推荐使用@Value方式注入属性,原因有二:

  • 对于较为复杂的数据结构难以设置,诸如Map,Object;
  • 不支持对属性值进行校验,诸如@Length,@Size等.

示例

#Simple properties
mail.host=mailer@mail.com
mail.port=9000
mail.from=mailer@mail.com

#List properties
mail.defaultRecipients[0]=admin@mail.com
mail.defaultRecipients[1]=owner@mail.com

#Map Properties
mail.additionalHeaders.redelivery=true
mail.additionalHeaders.secure=true
mail.additionalHeaders.p3=value

#Object properties
mail.credentials.username=john
mail.credentials.password=password
mail.credentials.authMethod=SHA1

以上为application.properties示范配置,下面将使用yaml表示:

#Simple properties
mail:
  host: mailer@mail.com
  port: 9000
  from: mailer@mail.com
#List properties
  defaultRecipients:
    - admin@mail.com
    - owner@mail.com
#Map Properties
  additionalHeaders:
    redelivery: true
    secure: true
    p3: true
#Object properties
  credentials:
    username: john
    password: password
    authMethod: SHA1

通过两份配置文件的比较,个人认为Yaml配置文件通过树形结构更加清晰明了.
两份文件同时展示了List,Map,Object形式配置文件的设置,可供大家参考.

@ConfigurationProperties属性获取

@Getter
@Setter
@Configuration
//@PropertySource("classpath:configprops.properties")
@ConfigurationProperties(prefix = "mail")
@Validated
public class ConfigProperties {

    @Validated
    @Getter
    @Setter
    public static class Credentials {

        @Length(max = 4, min = 1)
        private String authMethod;
        private String username;
        private String password;
    }

    @NotBlank
    private String host;
    @Min(1025)
    @Max(65536)
    private int port;
    @Pattern(regexp = "^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,6}$")
    private String from;
    private Credentials credentials;
    private List<String> defaultRecipients;
    private Map<String, String> additionalHeaders;
}

上述代码为获取Yaml配置文件中的属性值类,并且使用Configuration将类作为Bean提供给程序使用(可以去除此注解,将属性类型通过@Autowired注解注入Bean中).
注意,此处使用@ConfigurationProperties注解,获取前缀为mail的属性值.

Tips:

  • 可以添加注解,对属性值进行校验,诸如@NotBlank,@Pattern等;
  • 通过public static class Credentials类,将属性值注入Object对象内;
  • 通过@PropertySource注解实现从指定的配置文件读取属性设置.

@Value属性获取

hello.world.name=xiaoming

或者

hello:
  world:
    name: xiaoming

在属性文件中添加以上配置:

@RestController
public class HelloController {

    @Value("${hello.world.name}")
    private String name;
}

Bean中可以通过@Value获取属性值.
关于@value的文章较多,想深入了解的同学可以搜索学习.

pom依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

PS:
如果您觉得我的文章对您有帮助,可以扫码领取下红包,谢谢!
Spring Boot: Yaml配置文件 以及 @ConfigurationProperties属性获取