0%

加载自定义yml配置文件

加载自定义yml配置文件

springboot默认加载的是application.yml/properties配置文件,对于自定义的properties配置文件使用@PropertySource和@ConfigurationProperties注解搭配使用也可以进行加载注入,但是properties配置文件没有yml配置文件有层次感,如果使用自定义的yml配置文件却发现springboot并没有将yml中的配置属性注入进去

这里可以自定义PropertySourceFactory来加载yml(本质就是自己解析yml配置文件,转换成Properties)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class YmlPropertyFactory implements PropertySourceFactory {

@Override
public PropertySource<?> createPropertySource(String name, @NotNull EncodedResource resource) throws IOException {
// 将yml配置转换为Properties
Properties propertiesFromYaml = loadYamlIntoProperties(resource);
// 文件未找到使用默认的配置读取
if (propertiesFromYaml == null) {
return (name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource));
}
String sourceName = name != null ? name : resource.getResource().getFilename();
if(sourceName == null){
log.error("获取资源失败");
throw new RuntimeException("加载资源失败"+resource);
}
return new PropertiesPropertySource(sourceName, propertiesFromYaml);
}

private Properties loadYamlIntoProperties(EncodedResource resource) {
try {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(resource.getResource());
factory.afterPropertiesSet();
return factory.getObject();
} catch (IllegalStateException e) {
log.error("加载{}文件失败,请检查是否有该文件", resource.getResource().getFilename());
return null;
}
}
}

在使用的时候,就像使用自定义的properties配置文件类似

1
2
3
4
5
6
7
8
9
@PropertySource("classpath:custom.yml")
// factory指定自定义解析yml的PropertySourceFactory实现类
@ConfigurationProperties(factory=YmlPropertyFactory.class,prefix = "custom")
@Data
public class CustomProperties {
private Map<String,String> typeFileds;
private String name;

}