文章目录

  • 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相关推荐

  1. yml文件读取配置参数

    yml文件读取环境变量的参数 yml文件格式 server:   port: 8080 spring:   application:     name: xxx     version: 1.1.1 ...

  2. Java开发中文件读取方式总结

    JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径.路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:abc1.txt. 什么是相对路径呢?相对路径就是 ...

  3. java中文件读取方式的顺序_java中读取文件的方式

    java中读取文件的方式 经常遇到java中读取文件的方式,有时候需要指定编码,有时候不需要指定编码,被搞的挺晕的,抽时间整理了一下java读取文件的方式,主要是对字符型的处理,二进制的暂时不考虑. ...

  4. Java文件读取方式和效率性能对比

    场景描述 文件大小 8.67G的json文件,一共670万行. 服务器内存:2g.(只能读取一定缓冲数据,然后处理后继续读取,不能一次性加载到内存) 读取文件的内容出来,并未做业务处理. 读取方式和性 ...

  5. Springboot集成Quartz定时任务yml文件配置方式

    构建maven项目,引入maven依赖包 其中quartz.quartz-jobs.spring-boot-starter-quartz.spring-context-support  四个依赖包为q ...

  6. application.properties/yml文件读取

    在 SpringBoot 的核心配置文件中,除了使用内置的配置项之外,我们还可以在自定义配置,然后采用如下注解去读取配置的属性值 1.通过@Value注解读取:(配置项比较少的时候) 在 Spring ...

  7. python的文件读取方式_python中文件读取方式

    指\u201CPython编程:从入口到实践\u201D和\u201CPython编程快速启动\u201D1.文件路径获取文件路径包括绝对路径和相对路径.绝对路径是指\u201CE: \\ \\\u2 ...

  8. es中的高效文件读取方式

    es读取磁盘数据的时候主要使用了两种存储类型: NIO文件系统类型,对应FileChannel类的实现,多线程读写文件时性能较好 MMap文件系统类型,对应elasticsearch的MMapDire ...

  9. python 解析pb文件_将tensorflow模型打包成PB文件及PB文件读取方式

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  10. linux和windows和mac的文件读取方式的差异

    Unix系统里,每行结尾只有"<换行>",即"\n": Windows系统里面,每行结尾是"<换行><回车>&qu ...

最新文章

  1. WCF实现RESTFul Web Service
  2. 小米AI实验室六篇论文获ICASSP2022收录,多模态语音唤醒挑战赛夺冠
  3. 这老哥把GPU当暖气用,省钱了
  4. MySQL笔记——打开日志
  5. gdb 调试命令的使用及总结
  6. 网络驱动器无法访问,提示找不到网络路径故障处理过程
  7. 线性调频信号学习笔记
  8. (官方win10PE使用)微软官方win10PE取出文件操作教学
  9. 从头开始聊P问题、NP问题与NPC问题
  10. css字体加粗(dw怎么在css里字体加粗)
  11. MAC下外接键盘重复键的问题解决
  12. 从自己的角度比较《天书夜读》和《寒江独钓》
  13. 万字详解!Git 入门最佳实践 !
  14. 基于Python的视频中的人脸识别系统设计与实现
  15. 从图像超分辨率快速入门pytorch
  16. CVPR 2021 结果出炉!最全论文下载及分类汇总(更新中)
  17. python 离线翻译软件_Python使用tkinter制作在线翻译软件
  18. SSM集成支付宝(沙箱环境)
  19. 使命召唤10:幽灵中文版分享
  20. 马斯克的星链计划原理是什么,快跟室友一起学习一手卫星链路设计吧

热门文章

  1. Ubuntu18.04登陆界面美化--Mac主题
  2. 强制删除文件处理程序
  3. SQLServer 2008 下载地址(微软官方网站)
  4. FC经典游戏600合集for mac(小霸王游戏) 中文版
  5. 练习华为大型公司网络构建拓扑图
  6. 用C++写一个班级通讯录管理软件
  7. depot_tools
  8. R、Rstudio、Rtools的下载与安装
  9. 开源GIS简介.学习
  10. 电脑的热点手机连接不上怎么办