我想在嵌入式Tomcat 8容器中使用 WebApplicationInitializer 创建Spring WebApplicationContext,并且还希望为此提供父上下文的WebApplicationContext。
我在代码中所做的是:
ApplicationContext context = new ClassPathXmlApplicationContext(new
String[{"samples/context.xml"});
// ... here i do funny things with the context ...
比我创建一个Tomcat 8实例:
Tomcat t = new Tomcat()
// ... some configuration ...
t.start();
所以我正在搜索 WebApplicationInitializer 的实现:
@Override
public void onStartup(final ServletContext servletContext) throws ServletException
{
SpringContext parentContext = ... obtain parent, i know how ...
WebAppContext webCtx = new WebAppContext("classpath:sample/web.xml",
parentContext); // how can i do this?
// Manage the lifecycle of the root application context
servletContext.addListener(new ContextLoaderListener(webCtx)); // correct?
// now create dispatcher servlet using WebAppContext as parent
DispatcherServlet servlet = ... perform creation ...
// how?
}
我不想在web.xml中使用经典的 ContextLoaderListener 来在Tomcat启动时创建WebAppContext(即使如何告诉加载器也会很有趣使用预先构建的提供的上下文作为新上下文的父级
我也不想使用:
<import resource="classpath*:/META-INF/whatever/root/to/otherAppContext.xml" />
我也不想使用 AnnotationConfigWebApplicationContext 来使用注释驱动方法。
我也不想在我的WebAppContext中使用导入技巧来导入XML定义。
使用的技术:Spring 4.0.3,Tomcat 8,Java 8SE
任何建议如何实现 WebApplicationInitializer 的onStartup(...)方法?我看了Spring explanation,没有帮助我。 请提供具体的工作代码。
THX,
答案 0 :(得分:1)
这对我有用:
@Override
public void onStartup(final ServletContext servletContext) throws ServletException
{
final ApplicationContext parent = new ClassPathXmlApplicationContext(new String[
{"/com/mydomain/root.context.xml"});
XmlWebApplicationContext context = new XmlWebApplicationContext();
context.setConfigLocation("classpath:/com/mydomain/childContext.xml");
context.setParent(parent);
ConfigurableWebApplicationContext webappContext = (ConfigurableWebApplicationContext)
context;
webappContext.setServletContext(servletContext);
webappContext.refresh();
servletContext.addListener(new ContextLoaderListener(webappContext));
// ... register dispatcher servlets here ...
}
HTH,