参考

SpringBoot @ConfigurationProperties详解 - 腾讯云开发者社区-腾讯云 (tencent.com)

示例

1
2
3
4
5
6
@Data
@Component("portalConfig")
@ConfigurationProperties(prefix = "portal-config")
public class PortalConfig {
private Boolean esEnable = false; // 是否开启ES
}
1
2
portal-config:
esEnable: true

一个简单的例子

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

1
2
3
4
5
6
7
8
9
@Data
@Configuration
@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {

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

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

1
2
3
4
#Simple properties
mail.hostname=host@mail.com
mail.port=9000
mail.from=mailer@mail.com

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

1
2
3
4
5
mail.hostName
mail.hostname
mail.host_name
mail.host-name
mail.HOST_NAME

EnableConfigurationProperties

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

1
2
3
4
5
6
7
@SpringBootApplication
@EnableConfigurationProperties(ConfigProperties.class)
public class ConfigPropApp {
public static void main(String[] args) {
SpringApplication.run(ConfigPropApp.class,args);
}
}

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

1
2
3
4
5
6
7
@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:

1
2
3
4
5
6
@Data
public class Credentials {
private String authMethod;
private String username;
private String password;
}

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

1
2
3
4
5
6
7
8
9
10
11
@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;
}

对应的属性文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 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