2

我喜欢在嵌入式 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 的解释,没有帮助我。请提供具体的工作代码

谢谢,

4

1 回答 1

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 ...
}

高温下,

于 2014-04-28T16:03:04.190 回答