最常见的两种
- @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);