将applicationConfig PropertySource添加到新的环境中

时间:2017-06-15 16:22:28

标签: java spring spring-boot spring-environment

我目前正致力于将现有应用程序迁移到Spring Boot 1.2(使用Mule 3;并不与Spring 4.2兼容)。该应用程序包含一个库提供(我无法修改)servlet,它通过读取一些包含bean定义的应用程序包含的XML文件来创建多个ClasspathXmlApplicationContexts来执行Mule引导过程。

我的问题是这个XML文件包含几个占位符,应该根据活动的配置文件进行不同的解析(我已经将这些变量存储在application.yml文件中,具有不同的配置文件),但applicationConfig PropertySource isn& #39;在新应用程序上下文创建的StandardEnvironments上可用。

我可以将YML文件转换为.properties文件,并在每个XML文件中创建一个新的PropertyPlaceholderConfigurer,指向同一个应用程序 - #{systemProperties [' spring.profiles.active']} .properties,但是:

  1. 我失去了Boot使用约定和优先级在不同的内部/外部位置定位.properties文件的灵活性,这对于将要迁移的应用程序来说听起来很方便不同的环境。

  2. 如果我需要多次添加相同的定义,我想这是一种我无视的编程方式。

  3. 有谁知道如何将applicationConfig PropertySource的内容添加到所有新创建的ApplicationContexts而无需修改创建它们的类? Spring Boot 1.2没有这样做的环保功能。

2 个答案:

答案 0 :(得分:0)

对于将来的引用:我通过实现一个ApplicationListener来解决这个问题,该ApplicationListener在所有PropertySources中搜索applicationConfig的一个,并将它的所有属性放在System.getProperties()映射中,它们可以通过设置一个所有ApplicationContexts来解析它们在XML文件上为空。

答案 1 :(得分:0)

当您创建新的上下文时,可以使用类似以下内容将来自主环境的所有属性源添加到新创建的上下文中。

public AnnotationConfigApplicationContext createNewApplicationContext(ConfigurableEnvironment mainEnv) throws IOException {
AnnotationConfigApplicationContext newContext = new AnnotationConfigApplicationContext();
//Add scan for your packages
newContext.scan("com.abc.mycompany");
//Also Any different profile in association with new context can be added newContext.getEnvironment().addActiveProfile("newProfile");
mainEnv.getPropertySources().stream().filter(propertySource -> propertySource.getName().startsWith("applicationConfig")).forEach(newContext.getEnvironment().getPropertySources()::addLast);
newContext.refresh();
return newContext;
}

现在,您可以根据需要创建任意多个上下文。另外,在所有bean创建结束时都要注意这一点,您可以@PostConstruct并编写一个包装器方法来调用此新的上下文生成函数。