加载自定义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 { 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")
@ConfigurationProperties(factory=YmlPropertyFactory.class,prefix = "custom") @Data public class CustomProperties { private Map<String,String> typeFileds; private String name;
}
|