服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - springboot如何通过@PropertySource加载自定义yml文件

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

2022-10-23 16:57mobile18600007978 Java教程

这篇文章主要介绍了springboot如何通过@PropertySource加载自定义yml文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

@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

延伸 · 阅读

精彩推荐