我正在使用Spring 4.0.7
我通过JavaConfig进行了关于配置Spring MVC的研究。
直到昨天我才看到使用这两个选项的两种配置
注意 :( 2)是两个类,一个用于扩展,另一个用于实现
我正在使用(2)因为我找到了许多能够配置转换器,格式化程序,资源处理程序等的示例...
但是在最近的几天里,我试图帮助StackOverflow上的一个问题,我确实认识到(1)存在。我在Google上做了一些关于(1)的概述,并且存在一些与(1)一起工作的例子
我的问题是这篇文章的标题是如何描述的。
谢谢
答案 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 的正确类。有两种方法可以实现:
我还想强调,你提到的WebMvcConfigurerAdapter不应该与WebApplicationInitializer混淆。顾名思义 - 它与配置&#34; Mvc&#34;有关。它是一个从WebMvcConfigurer实现空方法的适配器类。当您使用@EnableWebMvc注释配置Mvc控制器时,可以使用它。
希望这有帮助。