springboot如何通过@PropertySource加载自定义yml文件

网友投稿 572 2022-08-17


springboot如何通过@PropertySource加载自定义yml文件

目录@PropertySource加载自定义yml文件@PropertySource注解对于yml的支持

@PropertySource加载自定义yml文件

使用@PropertySource默认加载的是.xml或者 .properties文件,因为在注解源码默认使用的是DefaultPropertySourceFactory实现处理文件内容,spring使用ResourcePropertySource从Resource构建Properties传给Spring。

系统的应用,比如加载自定义的文件,将配置文件内容存储在内存,如下:

那么加载一个自定义的.yml文件,就需要自定义实现ResourcePropertySource来处理yml文件的类

public class YamlPropertySourceFactory implements PropertySourceFactory {

@Override

public PropertySource> createPropertySource(String name, EncodedResource resource) throws IOException {

Properties propertiesFromYaml = loadYamlIntoProperties(resource);

String sourceName = name != null ? name : resource.getResource().getFilename();

return new PropertiesPropertySource(sourceName, propertiesFromYaml);

}

private Properties loadYamlIntoProperties(EncodedResource resource) throws FileNotFoundException {

try {

YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();

factory.setResources(resource.getResource());

factory.afterPropertiesSet();

return factory.getObject();

} catch (IllegalStateException e) {

// for ignoreResourceNotFound

Throwable cause = e.getCause();

if (cause instanceof FileNotFoundException)

throw (FileNotFoundException) e.getCause();

throw e;

}

}

}

@PropertySource注解对于yml的支持

@PropertySource只对properties文件可以进行加载,但对于yml或者yaml不能支持。

追寻源码。

public class DefaultPropelyDGSalrtySourceFactory implements PropertySourceFactory {

public DefaultPropertySourceFactory() {

}

public PropertySource> createPropertySource(String name, EncodedResource resource) throws IOException {

return name != null ? new ResourcePropertySource(name, resource) : new ResourcePropertySource(resource);

}

}

我们只需要继承DefaultPropertySourceFactory类并修改就可以了。

public class YamlConfigFactory extends DefaultPropertySourceFactory {

@Override

public PropertySource> createPropertySource(String name, EncodedResource resource) throws IOException {

String sourceName = name != null ? name : resource.getResource().getFilename();

if (!resource.getResource().exists()) {

return new PropertiesPropertySource(sourceName, new Properties());

} else if (sourceName.endsWith(".yml") || sourceName.endsWith(".yaml")) {

Properties propertiesFromYaml = loadYml(resource);

return new PropertiesPropertySource(sourceName, propertiesFromYaml);

} else {

return super.createPropertySource(name, resource);

}

}

private Properties loadYml(EncodedResource resource) throws IOException {

YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();

factory.setResources(resource.getResource());

factory.afterPropertiesSet();

return factory.getObject();

}

}

@PropertySource(value = {"classpath:dog.yml"},factory = YamlConfigFactory.class)

@Component

@ConfigurationProperties(prefix = "dog")

public class Dog {

private String name ;

lyDGSal private String age ;


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Netty启动步骤绑定端口源码分析
下一篇:SpringBoot实现token登录的示例代码
相关文章

 发表评论

暂时没有评论,来抢沙发吧~