With the release of the Servlet 3.0 spec it became possible to configure your Servlet Container with (almost) no xml. For this there is the ServletContainerInitializer
in the Servlet specification. In this class you can register filters, listeners, servlets etc. as you would traditionally do in a web.xml
.
Spring provides a an implementation the SpringServletContainerInitializer
which knows how to handle WebApplicationInitializer
classes. Spring also provides a couple of base classes to extend to make your life easier and the AbstractAnnotationConfigDispatcherServletInitializer
is one of those. It registers
a ContextLoaderlistener
(optionally) and a DispatcherServlet
and allows you to easily add configuration classes to load for both classes and to apply filters to the DispatcherServlet
and to provide the servlet mapping.
The WebMvcConfigurerAdapter
is for configuring Spring MVC, the replacement of the xml file loaded by the DispatcherServlet
for configuring Spring MVC. The WebMvcConfigurerAdapter
should be used for a @Configuration
class.
@Configuration
@EnableWebMvc
public class WebConfiguration
extends WebMvcConfigurerAdapter implements WebApplicationInitializer
{ ... }
I wouldn't recommend mixing those as they are basically 2 different concerns. The first is for configuring the servlet container, the latter for configuring Spring MVC.
You would want to split those into 2 classes.
For the configuration.
@Configuration
@EnableWebMvc
public class WebConfiguration extends WebMvcConfigurerAdapter { ... }
For bootstrapping the application.
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[] {"/"};
}
}
An added advantage is that you now can use the convenience classes provided by Spring instead of manually configuring the DispatcherServlet
and/or ContextLoaderListener
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…