从spring的application.yml中读取配置

x33g5p2x  于2022-09-21 转载在 Spring  
字(3.1k)|赞(0)|评价(0)|浏览(371)

在Spring中,我们通常将应用程序的配置数据和值保持在application.properties文件中,这些数据是静态的。然后当需要时,我们从application.properties文件中读取这些值。在这个文件中,参数和它们的值是以键值对的形式存储的。同样地,我们也可以使用application.yml文件来存储配置相关的数据。参数和值以YAML格式存储在这个文件中。使用application.yml的好处是我们可以以嵌套的形式存储键值。今天我将展示我们如何从application.yml文件中读取参数和它们相应的值。这个文件被保存在我们存储application.properties文件的同一个地方,也就是资源文件夹下。

application.yml

让我们假设我们想连接到另一个服务或应用程序,我们想建立它的完整路径。由于在不同的部署中,域是不同的。我们需要保留一个这些域的列表,在运行时我们需要确定哪些部署服务或应用程序正在运行。调用者应用程序需要在运行时或部署时确定这一点,当应用程序被启动时。根据部署情况,相应的URL需要用来建立调用者应用程序的完全合格路径。一个例子的结构可以是这样的,但我们可以把任何结构。这个例子有三个层次。第一层我们有BACKEND_URLS,然后在第二层我们有STAGING_DEVPRODUCTION1等,在叶子上我们有URL。

BACKEND_URLS:
  STAGING_DEV:
    URL: "d1c0c1d"
  PRODUCTION1:
    URL:  "urls.for.production1"
  PRODUCTION2:
    URL:  "urls.for.production2"
  PRODUCTION3:
    URL:  "urls.for.production3"

解析yml文件的代码

读取文件的代码被写成了一个spring配置文件,所以当应用程序启动时,文件将被读取,信息将被提取。The getYmlObject()方法读取文件,文件的内容被保存为地图,这里的地图元素的键将是第一层元素,值将是第一层元素的内容。当应用程序启动时,init()方法被执行,这个方法调用getYmlObject()方法。在这个例子文件中,我们只有一个第一级元素,就是 "BACKEND_URLS"。因此,键是BACKEND_URLS。然后我们调用getBaseObject()方法来提取第一层元素的值。返回的值仍然是一个带有键值对的地图。这次的键是STAGING_DEVPRODUCTION1等。接下来,应用程序需要知道它正在运行哪个部署,并需要提取该特定部署的URL。这里为了简单起见,我把部署的名称硬编码为PRODUCTION2。所以接下来我们要做的就是给这个键并提取值,这是结构中的第三级元素。在这个例子中,这就是URL参数和它的值。我们通过调用*getUrlMapForProd()方法来提取它。返回的值仍然是一个地图,其中键是 "URL",值是 "urls.for.production2"。最后我们使用getUrlFromMap()*方法来获取值。

import java.util.LinkedHashMap;
import java.util.Map;  
import org.springframework.beans.factory.config.YamlMapFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;  
import org.springframework.context.support.PropertySourcePlaceHolderConfigurer;  
import org.springframework.core.io.ClasspathResource ;

  @Configuration
  public class YmlConfig {
 
  @PostConstruct
  public void init() {
    initURL():
  }
 
  @Bean
  public static 
   PropertySourcePlaceHolderConfigurer  propertySourcePlaceHolderConfigurer() {
    return new  PropertySourcePlaceHolderConfigurer();
  }
 
  private void  initURL() {
    try {
      Map<String,Object> mapObject = getYmlObject();
      Map<String,Object> urlMap = null;
      Map<String,Object> prodToUrl = getBaseObject(mapObject);  
      if( prodToUrl  == null) {
        throw new Exception("some error message");
      }
      urlMap = getUrlMapForProd( prodToUrl, "PRODUCTION2");
      if( urlMap  == null) {
        throw new Exception("some error message");
      }
      String url = getUrlFromMap(urlMap);
      if(url == null || url.eqal("") ) {
        throw new Exception("some error message"); 
      }
    } catch(Exception e) {
       throw new Exception("some error message"); 
    }
  }
 
  Map<String,Object> getYmlObject() {
     YamlMapFactoryBean fBean = new  YamlMapFactoryBean();
     fBean.setResource(new ClasspathResource("application.yml"));
     fBean.setSingleton(true);
     return  fBean.getObject();
  }
 
  LinkedHashMap<String,Object> getBaseObject(Map<String,Object> mapObject) {
    return  (LinkedHashMap<String,Object>)  mapObject.get("BACKEND_URLS");
   } 
 
  LinkedHashMap<String,Object> getUrlMapForProd (Map<String,Object> prodToUrl, 
         String prod) {
    return  (LinkedHashMap<String,Object>) prodToUrl.get(prod);
  }  
 
  String  getUrlFromMap( Map<String,Object> urlMap) {
    return (String) urlMap.get("URL");
  }
}

相关文章

微信公众号

最新文章

更多