yml文件读取方式_1
文章目录
- 1.Environment
- 2.YamlPropertiesFactoryBean
- 3.监听事件
1.Environment
在Spring中有一个类Environment,它可以被认为是当前应用程序正在运行的环境,它继承了PropertyResolver接口,因此可以作为一个属性解析器使用。先创建一个yml文件,属性如下:
person:name: hydragender: maleage: 18
使用起来也非常简单,直接使用@Autowired就可以注入到要使用的类中,然后调用它的getProperty()方法就可以根据属性名称取出对应的值了
@RestController
public class EnvironmentController {@Autowiredprivate Environment environment;@GetMapping("envTest")private void getEnv(){System.out.println(environment.getProperty("person.name"));System.out.println(environment.getProperty("person.gender"));Integer autoClose = environment.getProperty("person.age", Integer.class);System.out.println(autoClose);String defaultValue = environment.getProperty("person.other", String.class, "defaultValue");System.out.println(defaultValue);}
}
在上面的例子中可以看到,除了简单的获取外,Environment提供的方法还可以对取出的属性值进行类型转换、以及默认值的设置,调用一下上面的接口,打印结果如下:
hydra
male
18
defaultValue
除了获取属性外,还可以用来判断激活的配置文件,我们先在application.yml中激活pro文件:
spring:profiles:active: pro
可以通过acceptsProfiles方法来检测某一个配置文件是否被激活加载,或者通过getActiveProfiles方法拿到所有被激活的配置文件。测试接口:
@GetMapping("getActiveEnv")
private void getActiveEnv(){System.out.println(environment.acceptsProfiles("pro"));System.out.println(environment.acceptsProfiles("dev"));String[] activeProfiles = environment.getActiveProfiles();for (String activeProfile : activeProfiles) {System.out.println(activeProfile);}
}
true
false
pro
2.YamlPropertiesFactoryBean
在Spring中还可以使用YamlPropertiesFactoryBean来读取自定义配置的yml文件,而不用再被拘束于application.yml及其激活的其他配置文件。
在使用过程中,只需要通过setResources()方法设置自定义yml配置文件的存储路径,再通过getObject()方法获取Properties对象,后续就可以通过它获取具体的属性,下面看一个例子:
@GetMapping("fcTest")
public void ymlProFctest(){YamlPropertiesFactoryBean yamlProFb = new YamlPropertiesFactoryBean();yamlProFb.setResources(new ClassPathResource("application2.yml"));Properties properties = yamlProFb.getObject();System.out.println(properties.get("person2.name"));System.out.println(properties.get("person2.gender"));System.out.println(properties.toString());
}
查看运行结果,可以读取指定的application2.yml的内容:
susan
female
{person2.age=18, person2.gender=female, person2.name=susan}
但是这样的使用中有一个问题,那就是只有在这个接口的请求中能够取到这个属性的值,如果再写一个接口,不使用YamlPropertiesFactoryBean读取配置文件,即使之前的方法已经读取过这个yml文件一次了,第二个接口取到的仍然还是空值。来对这个过程进行一下测试:
@Value("${person2.name:null}")
private String name;
@Value("${person2.gender:null}")
private String gender;@GetMapping("fcTest2")
public void ymlProFctest2(){System.out.println(name);System.out.println(gender);
}
先调用一次fcTest接口,再调用fcTest2接口时会打印null值:
null
null
想要解决这个问题也很简单,可以配合PropertySourcesPlaceholderConfigurer使用,它实现了BeanFactoryPostProcessor接口,也就是一个bean工厂后置处理器的实现,可以将配置文件的属性值加载到一个Properties文件中。使用方法如下:
@Configuration
public class PropertyConfig {@Beanpublic static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();YamlPropertiesFactoryBean yamlProFb = new YamlPropertiesFactoryBean();yamlProFb.setResources(new ClassPathResource("application2.yml"));configurer.setProperties(yamlProFb.getObject());return configurer;}
}
再次调用之前的接口,结果如下,可以正常的取到application2.yml中的属性:
susan
female
除了使用YamlPropertiesFactoryBean将yml解析成Properties外,其实我们还可以使用YamlMapFactoryBean解析yml成为Map,使用方法非常类似:
@GetMapping("fcMapTest")
public void ymlMapFctest(){YamlMapFactoryBean yamlMapFb = new YamlMapFactoryBean();yamlMapFb.setResources(new ClassPathResource("application2.yml"));Map<String, Object> map = yamlMapFb.getObject();System.out.println(map);
}
打印结果:
{person2={name=susan, gender=female, age=18}}
3.监听事件
首先,定义一个类实现ApplicationListener接口,监听的事件类型为ApplicationEnvironmentPreparedEvent,并在构造方法中传入要解析的yml文件名:
public class YmlListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {private String ymlFilePath;public YmlListener(String ymlFilePath){this.ymlFilePath = ymlFilePath;}//...
}
自定义的监听器中需要实现接口的onApplicationEvent()方法,当监听到ApplicationEnvironmentPreparedEvent事件时会被触发:
@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {ConfigurableEnvironment environment = event.getEnvironment();ResourceLoader loader = new DefaultResourceLoader();YamlPropertySourceLoader ymlLoader = new YamlPropertySourceLoader();try {List<PropertySource<?>> sourceList = ymlLoader.load(ymlFilePath, loader.getResource(ymlFilePath));for (PropertySource<?> propertySource : sourceList) {environment.getPropertySources().addLast(propertySource);}} catch (IOException e) {e.printStackTrace();}
}
上面的代码中,主要实现了:
- 获取当前环境Environment,当ApplicationEnvironmentPreparedEvent事件被触发时,已经完成了Environment的装载,并且能够通过event事件获取
- 通过YamlPropertySourceLoader加载、解析配置文件
- 将解析完成后的OriginTrackedMapPropertySource添加到Environment中
修改启动类,在启动类中加入这个监听器:
public static void main(String[] args) {SpringApplication application = new SpringApplication(MyApplication.class);application.addListeners(new YmlListener("classpath:/application2.yml"));application.run(args);
}
yml文件读取方式_1相关推荐
- yml文件读取配置参数
yml文件读取环境变量的参数 yml文件格式 server: port: 8080 spring: application: name: xxx version: 1.1.1 ...
- Java开发中文件读取方式总结
JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径.路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:abc1.txt. 什么是相对路径呢?相对路径就是 ...
- java中文件读取方式的顺序_java中读取文件的方式
java中读取文件的方式 经常遇到java中读取文件的方式,有时候需要指定编码,有时候不需要指定编码,被搞的挺晕的,抽时间整理了一下java读取文件的方式,主要是对字符型的处理,二进制的暂时不考虑. ...
- Java文件读取方式和效率性能对比
场景描述 文件大小 8.67G的json文件,一共670万行. 服务器内存:2g.(只能读取一定缓冲数据,然后处理后继续读取,不能一次性加载到内存) 读取文件的内容出来,并未做业务处理. 读取方式和性 ...
- Springboot集成Quartz定时任务yml文件配置方式
构建maven项目,引入maven依赖包 其中quartz.quartz-jobs.spring-boot-starter-quartz.spring-context-support 四个依赖包为q ...
- application.properties/yml文件读取
在 SpringBoot 的核心配置文件中,除了使用内置的配置项之外,我们还可以在自定义配置,然后采用如下注解去读取配置的属性值 1.通过@Value注解读取:(配置项比较少的时候) 在 Spring ...
- python的文件读取方式_python中文件读取方式
指\u201CPython编程:从入口到实践\u201D和\u201CPython编程快速启动\u201D1.文件路径获取文件路径包括绝对路径和相对路径.绝对路径是指\u201CE: \\ \\\u2 ...
- es中的高效文件读取方式
es读取磁盘数据的时候主要使用了两种存储类型: NIO文件系统类型,对应FileChannel类的实现,多线程读写文件时性能较好 MMap文件系统类型,对应elasticsearch的MMapDire ...
- python 解析pb文件_将tensorflow模型打包成PB文件及PB文件读取方式
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- linux和windows和mac的文件读取方式的差异
Unix系统里,每行结尾只有"<换行>",即"\n": Windows系统里面,每行结尾是"<换行><回车>&qu ...
最新文章
- WCF实现RESTFul Web Service
- 小米AI实验室六篇论文获ICASSP2022收录,多模态语音唤醒挑战赛夺冠
- 这老哥把GPU当暖气用,省钱了
- MySQL笔记——打开日志
- gdb 调试命令的使用及总结
- 网络驱动器无法访问,提示找不到网络路径故障处理过程
- 线性调频信号学习笔记
- (官方win10PE使用)微软官方win10PE取出文件操作教学
- 从头开始聊P问题、NP问题与NPC问题
- css字体加粗(dw怎么在css里字体加粗)
- MAC下外接键盘重复键的问题解决
- 从自己的角度比较《天书夜读》和《寒江独钓》
- 万字详解!Git 入门最佳实践 !
- 基于Python的视频中的人脸识别系统设计与实现
- 从图像超分辨率快速入门pytorch
- CVPR 2021 结果出炉!最全论文下载及分类汇总(更新中)
- python 离线翻译软件_Python使用tkinter制作在线翻译软件
- SSM集成支付宝(沙箱环境)
- 使命召唤10:幽灵中文版分享
- 马斯克的星链计划原理是什么,快跟室友一起学习一手卫星链路设计吧