春季-什么时候使用AbstractAnnotationConfigDispatcherServletInitializer和WebApplicationInitializer?
我正在使用Spring 4.0.7
我进行了有关通过JavaConfig配置Spring MVC的研究。
几乎直到昨天,我已经看到了使用这两个选项的两种配置
- 扩展AbstractAnnotationConfigDispatcherServletInitializer
- 扩展WebMvcConfigurerAdapter并实现WebApplicationInitializer
注意:(2)是两个类,一个用于扩展,另一个用于实现
我之所以使用(2),是因为我发现了许多可以配置转换器,格式化程序,资源处理程序等的示例。
但是在最近的日子里,我试图帮助解决有关StackOverflow的问题,但我确实意识到(1)存在。
我的问题是这篇文章的标题如何描述。
谢谢
随着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
。
从头开始,值得研究servlet容器的启动方式。
- SpringServletContainerInitializer由任何Servlet 3.0容器自动引导。
- SpringServletContainerInitializer寻找实现WebApplicationInitializer的类(链接到spring.io;在Craig Walls的“ Spring In Action”第4版,第135页中也有很好的描述)。
因此,SpringServletContainerInitializer必须找到实现WebApplicationInitializer的正确类。 有两种实现方式:
- 一种是通过自己实现WebApplicationInitializer;另一种是通过实现WebApplicationInitializer。 该接口是在Spring 3.1中引入的
- 第二个是通过扩展AbstractAnnotationConfigDispatcherServletInitializer类,该类也实现了WebApplicationInitializer。 为方便起见,在Spring 3.2中引入了该类,它是“使用基于Java的Spring配置的应用程序的首选方法”。 -请参阅链接。 它使您能够启动servlet应用程序上下文以及根应用程序上下文。
我还想强调您提到的WebMvcConfigurerAdapter不应与WebApplicationInitializer混淆。 顾名思义,它与配置“ Mvc”有关。 它是一个适配器类,用于实现WebMvcConfigurer中的空方法。 在使用@EnableWebMvc注释配置Mvc控制器时,可以使用它。
希望这可以帮助。