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

2022-02-20  本文已影响0人  lfboo

最常见的两种

准备

接下来要讲的几种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);
上一篇下一篇

猜你喜欢

热点阅读