SpringBoot @ConfigurationProperties使用详解

2020-02-11 12:03:23王冬梅

简介

本文将会详细讲解@ConfigurationProperties在Spring Boot中的使用。

添加依赖关系

首先我们需要添加Spring Boot依赖:

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <relativePath/> <!-- lookup parent from repository -->
</parent>

一个简单的例子

@ConfigurationProperties需要和@Configuration配合使用,我们通常在一个POJO里面进行配置:

@Data
@Configuration
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {

  private String hostName;
  private int port;
  private String from;
}

上面的例子将会读取properties文件中所有以mail开头的属性,并和bean中的字段进行匹配:

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

Spring的属性名字匹配支持很多格式,如下所示所有的格式都可以和hostName进行匹配:

mail.hostName
mail.hostname
mail.host_name
mail.host-name
mail.HOST_NAME

如果你不想使用@Configuration, 那么需要在@EnableConfigurationProperties注解中手动导入配置文件如下:

@SpringBootApplication
@EnableConfigurationProperties(ConfigProperties.class)
public class ConfigPropApp {
  public static void main(String[] args) {
    SpringApplication.run(ConfigPropApp.class,args);
  }
}

我们也可以在@ConfigurationPropertiesScan中指定Config文件的路径:

@SpringBootApplication
@ConfigurationPropertiesScan("com.flydean.config")
public class ConfigPropApp {
  public static void main(String[] args) {
    SpringApplication.run(ConfigPropApp.class,args);
  }
}

这样的话程序只会在com.flydean.config包中查找config文件。

属性嵌套

我们可以嵌套class,list,map, 下面我们举个例子,先创建一个普通的POJO:

@Data
public class Credentials {
  private String authMethod;
  private String username;
  private String password;
}

然后创建一个嵌套的配置文件:

@Data
@Configuration
@ConfigurationProperties(prefix = "nestmail")
public class NestConfigProperties {
  private String host;
  private int port;
  private String from;
  private List<String> defaultRecipients;
  private Map<String, String> additionalHeaders;
  private Credentials credentials;
}

对应的属性文件如下:

# nest Simple properties
nestmail.hostname=mailer@mail.com
nestmail.port=9000
nestmail.from=mailer@mail.com

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

#Map Properties
nestmail.additionalHeaders.redelivery=true
nestmail.additionalHeaders.secure=true

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