千家信息网

springboot怎么通过@PropertySource加载自定义yml文件

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,小编给大家分享一下springboot怎么通过@PropertySource加载自定义yml文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我
千家信息网最后更新 2025年01月20日springboot怎么通过@PropertySource加载自定义yml文件

小编给大家分享一下springboot怎么通过@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 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 ;

以上是"springboot怎么通过@PropertySource加载自定义yml文件"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0