美文网首页
yml文件常见的几种读取方式

yml文件常见的几种读取方式

作者: lfboo | 来源:发表于2022-02-20 20:40 被阅读0次

    最常见的两种

    • @Value
    • @ConfigurationProperties
      针对这两种,不熟悉的可以自行搜索,网上已经有太多的介绍,这里主要介绍这两种外的用法。

    准备

    接下来要讲的几种case要用到如下的yml文件
    application.yml

    person:
      name: lfboo
      sex: male
    

    application1.yml

    settings:
      propertyName: redis 
      propertyValue: redis-url
    

    Environment

    借助Spring提供的一个类,org.springframework.core.env.Environment, 它继承了PropertyResolver, 所以可以当作属性解析器使用

    @Resource
    private Environment environment;
    
    private void test1(){
          System.out.println(environment.getProperty("person.name"));
          System.out.println(environment.getProperty("person.sex"));
    }
    

    YamlPropertiesFactoryBean

    Spring提供了YamlPropertiesFactoryBean可以读取自定义配置yml文件,不再拘泥于application.yml及其激活的其他配置文件

    public void ymlProFctest(){
        YamlPropertiesFactoryBean yamlProFb = new YamlPropertiesFactoryBean();
        yamlProFb.setResources(new ClassPathResource("application1.yml"));
        Properties properties = yamlProFb.getObject();
        System.out.println(properties.get("settings.propertyName"));
        System.out.println(properties.get("settings.propertyValue"));
    }
    

    存在问题: 那就是只有在这个接口的请求中能够取到这个属性的值,如果再写一个接口,不使用YamlPropertiesFactoryBean读取配置文件,即使之前的方法已经读取过这个yml文件一次了,第二个接口取到的仍然还是空值。
    解决方式: 配合PropertySourcesPlaceholderConfigurer使用,它实现了BeanFactoryPostProcessor接口,也就是一个bean工厂后置处理器的实现,可以将配置文件的属性值加载到一个Properties文件中。使用方法如下:

    @Configuration
    public class PropertyConfig {
        @Bean
        public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
            PropertySourcesPlaceholderConfigurer configurer 
               = new PropertySourcesPlaceholderConfigurer();
            YamlPropertiesFactoryBean yamlProFb 
                = new YamlPropertiesFactoryBean();
            yamlProFb.setResources(new ClassPathResource("application1.yml"));
            configurer.setProperties(yamlProFb.getObject());
            return configurer;
        }
    }
    

    除了使用YamlPropertiesFactoryBean将yml解析成Properties外,其实我们还可以使用YamlMapFactoryBean解析yml成为Map

    SnakeYml

    使用snakeYml,需要引入依赖

    <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>1.23</version>
    </dependency>
    

    使用方式:

    Yaml yaml=new Yaml();
    Iterable<Object> objects = 
            yaml.loadAll(getClass().getClassLoader()
                .getResourceAsStream("application1.yml"));
    System.out.println(objects);
    

    jackson-dataformat-yaml

    使用jackson,需要引入依赖

    <dependency>
        <groupId>com.fasterxml.jackson.dataformat</groupId>
        <artifactId>jackson-dataformat-yaml</artifactId>
        <version>2.12.3</version>
    </dependency>
    

    使用jackson读取yml也非常简单,这里用到了常用的ObjectMapper,在创建ObjectMapper对象时指定使用YAML工厂,之后就可以简单的将yml映射到实体:

    ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    InputStream input =
            new FileInputStream("${path}application1.yml");
    Person person = objectMapper.readValue(input, Person.class);
    System.out.println(person.toString());
    

    jackson还可以生成yml文件

    Map<String,Object> map=new HashMap<>();
    Student stu1 = new Student("Trunks", "male");
    Student stu2 = new Student("Goten", "male");
    Student students=new Student(stu1,stu2);
    map.put("person",person);
    
    ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
    objectMapper.writeValue(new File("~/Download/yml/src/main/resources/test1.yml"),map);
    

    相关文章

      网友评论

          本文标题:yml文件常见的几种读取方式

          本文链接:https://www.haomeiwen.com/subject/xwwilrtx.html