何时使用AbstractAnnotationConfigDispatcherServletInitializer和WebApplicationInitializer?

时间:2014-10-31 14:15:40

标签: spring spring-mvc spring-3 spring-4

我正在使用Spring 4.0.7

我通过JavaConfig进行了关于配置Spring MVC的研究。

直到昨天我才看到使用这两个选项的两种配置

  1. 扩展AbstractAnnotationConfigDispatcherServletInitializer
  2. 扩展WebMvcConfigurerAdapter 实现WebApplicationInitializer
  3. 注意 :( 2)是两个类,一个用于扩展,另一个用于实现

    我正在使用(2)因为我找到了许多能够配置转换器,格式化程序,资源处理程序等的示例...

    但是在最近的几天里,我试图帮助StackOverflow上的一个问题,我确实认识到(1)存在。我在Google上做了一些关于(1)的概述,并且存在一些与(1)一起工作的例子

    我的问题是这篇文章的标题是如何描述的。

    谢谢

2 个答案:

答案 0 :(得分:54)

随着Servlet 3.0规范的发布,可以配置(几乎)没有xml的Servlet容器。为此,Servlet规范中有ServletContainerInitializer 。在这个类中,您可以像在web.xml中那样注册过滤器,监听器,servlet等。

Spring提供了一个SpringServletContainerInitializer实现,它知道如何处理WebApplicationInitializer类。 Spring还提供了几个基类来扩展以使您的生活更轻松AbstractAnnotationConfigDispatcherServletInitializer就是其中之一。它注册 一个ContextLoaderlistener(可选)和一个DispatcherServlet,允许您轻松添加配置类以加载这两个类,并将过滤器应用于DispatcherServlet并提供servlet映射。

WebMvcConfigurerAdapter用于配置Spring MVC,替换DispatcherServlet加载的xml文件以配置Spring MVC。 WebMvcConfigurerAdapter应该用于@Configuration类。

@Configuration
@EnableWebMvc
public class WebConfiguration 
    extends WebMvcConfigurerAdapter implements WebApplicationInitializer
{ ... }

我不建议将它们混合起来,因为它们基本上是两个不同的问题。第一个用于配置servlet容器,后者用于配置Spring MVC。

您可能希望将这些分为两类。

用于配置。

@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter { ... }

用于引导应用程序。

public class MyWebApplicationInitializer
    extends AbstractAnnotationConfigDispatcherServletInitializer
{

    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {RootConfig.class};
    }

    protected Class<?>[] getServletConfigClasses()  {
        return new Class[] {WebConfiguration .class};
    }

    protected String[] getServletMappings() {
        return new String[] {"/"};
    }

}

另一个优点是您现在可以使用Spring提供的便捷类,而不是手动配置DispatcherServlet和/或ContextLoaderListener

答案 1 :(得分:12)

从头开始,值得研究servlet容器的启动方式。

首先,SpringServletContainerInitializer必须找到实现 WebApplicationInitializer 的正确类。有两种方法可以实现:

  1. 一个是自己实施WebApplicationInitializer;该接口是在Spring 3.1中引入的。
  2. 第二个是扩展AbstractAnnotationConfigDispatcherServletInitializer类,它也实现了WebApplicationInitializer。为方便起见,该类在Spring 3.2中引入,它是使用基于Java的Spring配置的应用程序的首选方法。&#34; - 看到链接。它使您能够启动servlet应用程序上下文以及根应用程序上下文。
  3. 我还想强调,你提到的WebMvcConfigurerAdapter不应该与WebApplicationInitializer混淆。顾名思义 - 它与配置&#34; Mvc&#34;有关。它是一个从WebMvcConfigurer实现空方法的适配器类。当您使用@EnableWebMvc注释配置Mvc控制器时,可以使用它。

    希望这有帮助。