在Springmvc中使用Webapplicationinitializer注入调度程序servlet

时间:2012-04-09 19:58:21

标签: java-ee servlets spring-mvc

我必须动态加载调度程序servlet及其配置文件。我正在研究使用webapplicationinitializer注入调度程序servlet的概念,这是一个非常新的春季开发。以下文档概述了: http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/WebApplicationInitializer.html

我正在尝试进行基本设置,但它无法正常工作。我无法理解在哪里开始摆脱传统的春季开发。任何人都可以用一个例子来解释我如何使用这种新机制?我使用了以下代码:

 public class MyWebAppInitializer implements WebApplicationInitializer {

@Override
public void onStartup(ServletContext container) {
  // Create the 'root' Spring application context
  AnnotationConfigWebApplicationContext rootContext =
    new AnnotationConfigWebApplicationContext();
  rootContext.register(AppConfig.class);

  // Manage the lifecycle of the root application context
  container.addListener(new ContextLoaderListener(rootContext));

  // Create the dispatcher servlet's Spring application context
  AnnotationConfigWebApplicationContext dispatcherContext =
    new AnnotationConfigWebApplicationContext();
  dispatcherContext.register(DispatcherConfig.class);

  // Register and map the dispatcher servlet
  ServletRegistration.Dynamic dispatcher =
    container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
  dispatcher.setLoadOnStartup(1);
  dispatcher.addMapping("/");
}

}

此外,如果我们动态注入调度程序servlet,是否意味着在Web容器(tomcat)启动期间加载调度程序servlet?

1 个答案:

答案 0 :(得分:0)

尝试将映射从/更改为dispatcher.addMapping("/*")

/已映射到Tomcat的默认Servlet,因此addMapping("/")将不会执行任何操作。

这仅适用于使用Tomcat版本< = 14。

的情况

在Tomcat启动时,tomcat将查找implements ServletContainerInitializer的类。在Spring中,它将找到类SpringServletContainerInitializer。这个类将被提供一组Tomcat加载的类(基本上所有的类)。然后,它会查找implements WebApplicationInitializer并在其上调用onStartup()的任何人。这就是你上面发布的方法发挥作用,初始化上下文和Spring的`DispatcherServlet。