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

作者:mobile18600007978 时间:2022-08-06 19:42:56 

@PropertySource加载自定义yml文件

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

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

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

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

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

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

springboot如何通过@PropertySource加载自定义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
  • asp之家 软件编程 m.aspxhome.com