如何使用以编程方式创建的父上下文在嵌入式Servlet 3环境中创建基于Spring(4)XML的WebApplicationContext?

时间:2014-04-28 14:27:14

标签: java spring-mvc applicationcontext spring-4 tomcat8

我想在嵌入式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,

1 个答案:

答案 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,