在Spring中,我们通常将应用程序的配置数据和值保持在application.properties文件中,这些数据是静态的。然后当需要时,我们从application.properties文件中读取这些值。在这个文件中,参数和它们的值是以键值对的形式存储的。同样地,我们也可以使用application.yml文件来存储配置相关的数据。参数和值以YAML格式存储在这个文件中。使用application.yml的好处是我们可以以嵌套的形式存储键值。今天我将展示我们如何从application.yml文件中读取参数和它们相应的值。这个文件被保存在我们存储application.properties文件的同一个地方,也就是资源文件夹下。
让我们假设我们想连接到另一个服务或应用程序,我们想建立它的完整路径。由于在不同的部署中,域是不同的。我们需要保留一个这些域的列表,在运行时我们需要确定哪些部署服务或应用程序正在运行。调用者应用程序需要在运行时或部署时确定这一点,当应用程序被启动时。根据部署情况,相应的URL需要用来建立调用者应用程序的完全合格路径。一个例子的结构可以是这样的,但我们可以把任何结构。这个例子有三个层次。第一层我们有BACKEND_URLS,然后在第二层我们有STAGING_DEV,PRODUCTION1等,在叶子上我们有URL。
BACKEND_URLS:
STAGING_DEV:
URL: "d1c0c1d"
PRODUCTION1:
URL: "urls.for.production1"
PRODUCTION2:
URL: "urls.for.production2"
PRODUCTION3:
URL: "urls.for.production3"
读取文件的代码被写成了一个spring配置文件,所以当应用程序启动时,文件将被读取,信息将被提取。The getYmlObject()方法读取文件,文件的内容被保存为地图,这里的地图元素的键将是第一层元素,值将是第一层元素的内容。当应用程序启动时,init()方法被执行,这个方法调用getYmlObject()方法。在这个例子文件中,我们只有一个第一级元素,就是 "BACKEND_URLS"。因此,键是BACKEND_URLS。然后我们调用getBaseObject()方法来提取第一层元素的值。返回的值仍然是一个带有键值对的地图。这次的键是STAGING_DEV,PRODUCTION1等。接下来,应用程序需要知道它正在运行哪个部署,并需要提取该特定部署的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");
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.cloudnativemaster.com/post/read-configuration-from-application-yml-in-spring
内容来源于网络,如有侵权,请联系作者删除!