春季-什么时候使用AbstractAnnotationConfigDispatcherServletInitializer和WebApplicationInitializer?

我正在使用Spring 4.0.7

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

几乎直到昨天,我已经看到了使用这两个选项的两种配置

  1. 扩展AbstractAnnotationConfigDispatcherServletInitializer
  2. 扩展WebMvcConfigurerAdapter并实现WebApplicationInitializer

注意:(2)是两个类,一个用于扩展,另一个用于实现

我之所以使用(2),是因为我发现了许多可以配置转换器,格式化程序,资源处理程序等的示例。

但是在最近的日子里,我试图帮助解决有关StackOverflow的问题,但我确实意识到(1)存在。

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

谢谢

Manuel Jordan asked 2020-08-09T12:25:14Z
2个解决方案
55 votes

随着Servlet 3.0规范的发布,可以(几乎)没有xml配置Servlet容器。 为此,Servlet规范中提供了DispatcherServlet。 在该类中,您可以注册过滤器,侦听器,Servlet等,就像您传统上在DispatcherServlet中所做的那样。

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

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

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

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

您可能希望将它们分为2类。

对于配置。

@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

M. Deinum answered 2020-08-09T12:25:52Z
14 votes

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

  • SpringServletContainerInitializer由任何Servlet 3.0容器自动引导。
  • SpringServletContainerInitializer寻找实现WebApplicationInitializer的类(链接到spring.io;在Craig Walls的“ Spring In Action”第4版,第135页中也有很好的描述)。

因此,SpringServletContainerInitializer必须找到实现WebApplicationInitializer的正确类。 有两种实现方式:

  1. 一种是通过自己实现WebApplicationInitializer;另一种是通过实现WebApplicationInitializer。 该接口是在Spring 3.1中引入的
  2. 第二个是通过扩展AbstractAnnotationConfigDispatcherServletInitializer类,该类也实现了WebApplicationInitializer。 为方便起见,在Spring 3.2中引入了该类,它是“使用基于Java的Spring配置的应用程序的首选方法”。 -请参阅链接。 它使您能够启动servlet应用程序上下文以及根应用程序上下文。

我还想强调您提到的WebMvcConfigurerAdapter不应与WebApplicationInitializer混淆。 顾名思义,它与配置“ Mvc”有关。 它是一个适配器类,用于实现WebMvcConfigurer中的空方法。 在使用@EnableWebMvc注释配置Mvc控制器时,可以使用它。

希望这可以帮助。

Witold Kaczurba answered 2020-08-09T12:26:44Z
translate from https://stackoverflow.com:/questions/26676782/when-use-abstractannotationconfigdispatcherservletinitializer-and-webapplication