Java 将applicationConfig PropertySource添加到新环境
我目前正在将现有的应用程序迁移到SpringBoot1.2(使用Mule3;与Spring4.2不兼容)。这个应用程序包含一个提供的库(我无法修改)servlet,它通过读取一些应用程序包含的带有bean定义的XML文件来创建几个ClasspathXmlApplicationContexts,从而执行Mule引导过程 我的问题是,此XML文件包含多个占位符,这些占位符应根据活动配置文件以不同的方式解决(我已使用不同的配置文件将这些变量存储在application.yml文件中),但applicationConfig PropertySource在新应用程序上下文创建的标准环境中不可用 我可以将YML文件转换为.properties文件,并在每个XML文件中创建一个新的PropertyPlaceHolderConfigure,指向同一个应用程序-#{systemProperties['spring.profiles.active']}.properties,但是:Java 将applicationConfig PropertySource添加到新环境,java,spring,spring-boot,spring-environment,Java,Spring,Spring Boot,Spring Environment,我目前正在将现有的应用程序迁移到SpringBoot1.2(使用Mule3;与Spring4.2不兼容)。这个应用程序包含一个提供的库(我无法修改)servlet,它通过读取一些应用程序包含的带有bean定义的XML文件来创建几个ClasspathXmlApplicationContexts,从而执行Mule引导过程 我的问题是,此XML文件包含多个占位符,这些占位符应根据活动配置文件以不同的方式解决(我已使用不同的配置文件将这些变量存储在application.yml文件中),但applica
有人知道我如何将applicationConfig PropertySource的内容添加到所有新创建的ApplicationContexts中,而不必修改创建它们的类吗?Spring Boot 1.2没有Environment PostProcessor的惊人之处。供将来参考:我通过实现一个ApplicationListener来解决这个问题,它搜索应用程序配置的所有属性资源,并将其所有属性放在System.getProperties()映射上,所有ApplicationContexts都可以通过在XML文件上设置一个空来解析它们。当您创建一个新上下文时,主环境中的所有属性源都可以使用类似的方式添加到新创建的上下文中
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并编写一个包装器方法来调用这个新的上下文生成函数