springboot如何通过@PropertySource加载自定义yml文件
目录
- @PropertySource加载自定义yml文件
- @PropertySource注解对于yml的支持
@PropertySource加载自定义yml文件 【springboot如何通过@PropertySource加载自定义yml文件】使用@PropertySource默认加载的是.xml或者 .properties文件,因为在注解源码默认使用的是DefaultPropertySourceFactory实现处理文件内容,spring使用ResourcePropertySource从Resource构建Properties传给Spring。
文章图片
系统的应用,比如加载自定义的文件,将配置文件内容存储在内存,如下:
文章图片
那么加载一个自定义的.yml文件,就需要自定义实现ResourcePropertySource来处理yml文件的类
文章图片
文章图片
public class YamlPropertySourceFactory implements PropertySourceFactory {@Overridepublic 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 ignoreResourceNotFoundThrowable cause = e.getCause(); if (cause instanceof FileNotFoundException)throw (FileNotFoundException) e.getCause(); throw e; }}}
@PropertySource注解对于yml的支持 @PropertySource只对properties文件可以进行加载,但对于yml或者yaml不能支持。
追寻源码。
public class DefaultPropertySourceFactory 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 {@Overridepublic 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 = https://www.it610.com/article/{"classpath:dog.yml"},factory = YamlConfigFactory.class)@Component@ConfigurationProperties(prefix = "dog")public class Dog {private String name ; private String age ;
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- Springboot与vue实例讲解实现前后端分离的人事管理系统
- 人工智能教程|第四课(神经网络是如何进行预测的)
- vue遮罩层如何阻止滚动
- 直播类app如何进行人群定位
- 如何组装一个注册中心
- 单元测试|如何写Java单元测试
- 单元测试|什么是单元测试,如何去写一个单元测试
- #|【Springboot】微服务中使用腾讯云T-Sec天御对文本及图片内容进行安全检测
- 在SpringBoot中使用Spring|在SpringBoot中使用Spring Session解决分布式会话共享问题
- #|【SpringBoot】微服务中异步调用数据提交数据库的问题