0

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

我的问题是这个 XML 文件包含几个占位符,应该根据活动配置文件以不同的方式解析(我已经将这些变量存储在 application.yml 文件中,具有不同的配置文件),但是 applicationConfig PropertySource 在由新应用程序上下文创建的标准环境。

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

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

  2. 如果我需要多次添加相同的定义,我想有一种我忽略的编程方式。

有谁知道我如何将 applicationConfig PropertySource 的内容添加到所有新创建的 ApplicationContexts 中而无需修改创建它们的类?Spring Boot 1.2 没有 EnvironmentPostProcessor 的强大功能。

4

2 回答 2

0

当您创建一个新的 Context 时,可以使用类似的东西将来自主 env 的所有属性源添加到新创建的上下文中。

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 并编写一个调用这个新的上下文生成函数的包装器方法。

于 2020-12-11T11:20:32.803 回答
0

供将来参考:我已经通过实现一个 ApplicationListener 解决了这个问题,它在所有 PropertySources 中搜索 applicationConfig 的属性,并将其所有属性放在 System.getProperties() 映射上,所有 ApplicationContexts 都可以通过在XML 文件。

于 2017-08-23T16:05:23.000 回答