当我们最近将第二个 Spring 应用程序部署到同一个 Tomcat 时,我们遇到了意外交互的问题。
正如经常发生的那样,这打开了一大堆关于我如何创建春天背景的蠕虫。这不是 Spring Boot 应用程序。
Spring中不乏使用Servlet 3.0初始化的例子。但是我找不到一个使用 Spring 配置文件和基于 @Configuration 注释的上下文初始化的一个。
在经历了很多痛苦之后,我决定这样做:
AnnotationConfigWebApplicationContext rootApplicationContext = new AnnotationConfigWebApplicationContext();
String [] activeProfiles = {"root","oracle"};
rootApplicationContext.getEnvironment().setActiveProfiles(activeProfiles);
rootApplicationContext.scan("com.xxx.restserver.config");
// Create the dispatcher servlet's application context
AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
String[] dispatcherActiveProfiles = {"web"};
dispatcherContext.getEnvironment().setActiveProfiles(dispatcherActiveProfiles);
dispatcherContext.setParent(rootApplicationContext);
dispatcherContext.scan("com.xxx.restserver.config");
// Managed the lifecycle of the application context
servletContext.addListener(new ContextLoaderListener(rootApplicationContext));
// Register and map the dispatcher Servlet
ServletRegistration.Dynamic dispatcher =
servletContext.addServlet("Dispatcher", new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
唯一的问题是根上下文@configuration 文件被“处理”了两次。扫描一次,但实例化 ContextLoaderListener 时再一次。我使用引号是因为第一次进行一些初始化但上下文没有处于可用状态。
我玩过 context.refresh() 但这让事情变得更糟。
所有这些都会导致一些奇怪的问题,尤其是根上下文中的 EHCache。总的来说,我可以忽略它。但似乎应该有一种方法可以让 Spring 准确地扫描每个上下文一次——并且仍然支持 Profiles。但我没有想法。