1、Environment在Spring中有一个类Environment,它能够被认为是以后应用程序正在运行的环境,它继承了PropertyResolver接口,因而能够作为一个属性解析器应用。先创立一个yml文件,属性如下:person: name: hydra gender: male age: 18复制代码应用起来也非常简单,间接应用@Autowired就能够注入到要应用的类中,而后调用它的getProperty()办法就能够依据属性名称取出对应的值了。@RestControllerpublic 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提供的办法还能够对取出的属性值进行类型转换、以及默认值的设置,调用一下下面的接口,打印后果如下:hydramale18defaultValue复制代码除了获取属性外,还能够用来判断激活的配置文件,咱们先在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);}}复制代码打印后果:truefalsepro复制代码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的内容:susanfemale{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值:nullnull复制代码想要解决这个问题也很简略,能够配合PropertySourcesPlaceholderConfigurer应用,它实现了BeanFactoryPostProcessor接口,也就是一个bean工厂后置处理器的实现,能够将配置文件的属性值加载到一个Properties文件中。应用办法如下:@Configurationpublic class PropertyConfig {
...