springboot如何通过@PropertySource加载自定义yml文件
作者:mobile18600007978 时间:2022-08-06 19:42:56
@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 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 {
@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 ;
private String age ;
来源:https://blog.csdn.net/mobile18611667978/article/details/104439706
标签:springboot,@PropertySource,yml
0
投稿
猜你喜欢
C#中Dynamic和Dictionary性能比较
2022-05-11 12:16:33
C#基础学习系列之Attribute和反射详解
2022-07-19 17:55:40
深入理解C#中常见的委托
2022-03-23 01:05:46
Kotlin基础学习之循环和异常
2023-05-26 00:42:12
详解SpringBoot禁用Swagger的三种方式
2022-02-28 23:49:08
java input 调用手机相机和本地照片上传图片到服务器然后压缩的方法
2023-04-26 08:20:27
教你怎么用idea创建web项目
2021-12-23 14:45:16
Spring整合Mybatis思路梳理总结
2022-04-26 03:56:12
Android实用的代码片段 常用代码总结
2022-02-02 20:29:53
Java获取指定字符串出现次数的方法
2022-05-11 16:06:23
java随机生成8位数授权码的实例
2022-04-24 12:03:47
Android实现Activity水平和垂直滚动条的方法
2021-07-04 13:06:06
springboot整合shiro多验证登录功能的实现(账号密码登录和使用手机验证码登录)
2023-05-25 18:53:29
winform用datagridview制作课程表实例
2023-11-24 06:08:28
Android实现蒙版弹出框效果
2023-06-14 17:13:43
详解Java String字符串获取每一个字符及常用方法
2022-12-14 05:15:33
Android自定义可控制速度的跑马灯
2023-08-11 14:05:00
Java获取控制台输入的两种方法小结
2023-11-29 12:40:44
将java项目打包成exe可执行文件的完整步骤
2021-11-10 03:48:04
C# 异步多线程入门基础
2022-01-19 05:23:05