参考
- Spring in Action(4th Edition)
不使用web.xml配置DispatchServlet
在Servlet 3.0以上环境, 容器会在classpath
寻找实现了javax.servlet .ServletContainerInitializer
接口的类. 如果找到了, 那么会用于配置该Servlet容器.
Spring提供了一个实现了该接口的类SpringServlet-ContainerInitializer
. Spring的这个类会寻找任何实现了Web- ApplicationInitializer
接口的类, 并将配置工作转交给它. Spring 3.2 加入了一个方便的基本实现类AbstractAnnotationConfigDispatcherServletInitializer
. 那么我们只需要写一个类继承于该类, 那么将程序部署到Servlet 3.0容器的时候, 将会被自动发现而且用于配置servlet context.
实例
SpittrWebAppInitializer.java
- getRootConfigClasses()
其实就是对应ApplicationContext.xml, 配置了整个程序通用的beans. - getServletConfigClasses()
其实就是对应SpringMVC的xml配置, 配置了Controller
这些. - getServletMappings()
其实就是对应DispatcherServlet的<servlet-mapping>
package me.xiaofud.spring101.spittr.config;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
/**
* Created by xiaofu on 17-11-11.
*/
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
protected Class<?>[] getServletConfigClasses() {
return new Class[]{WebConfig.class};
}
protected String[] getServletMappings() {
// mapping for DispatcherServlet
return new String[]{"/app/*"};
// return new String[]{"/"};
}
}
RootConfig.java
package me.xiaofud.spring101.spittr.config;
import org.springframework.context.annotation.Configuration;
/**
* Created by xiaofu on 17-11-11.
* As application context
*/
@Configuration
@ComponentScan
public class RootConfig {
}
WebConfig.java
理解@EableWebMvc注解:
- Stackoverflow - enablewebmvc-annotation-meaning
- Spring MVC - Importing configurations with @EnableWebMvc
- hahalq - Spring mvc注解配置的背后
@EableWebMvc 等价于 xml 文件中的 <mvc:annotation-driven />
.
使用该注解其实是导入了WebMvcConfigurationSupport
, 以其作为基本的配置文件, 即会导入一些很常用的bean.
package me.xiaofud.spring101.spittr.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
/**
* Created by xiaofu on 17-11-11.
* As springmvc context
*/
@Configuration
@EnableWebMvc
@ComponentScan("me.xiaofud.spring101.spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver resourceViewResolver = new InternalResourceViewResolver();
resourceViewResolver.setPrefix("/WEB-INF/views/");
resourceViewResolver.setSuffix(".jsp");
resourceViewResolver.setExposeContextBeansAsAttributes(true);
return resourceViewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// configure static content handling
configurer.enable();
}
}
部署到Tomcat后的输出:
12-Nov-2017 17:07:27.112 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.prepareRefresh Refreshing Root WebApplicationContext: startup date [Sun Nov 12 17:07:27 CST 2017]; root of context hierarchy
12-Nov-2017 17:07:27.164 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.loadBeanDefinitions Registering annotated classes: [class me.xiaofud.spring101.spittr.config.RootConfig]
12-Nov-2017 17:07:27.497 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.context.ContextLoader.initWebApplicationContext Root WebApplicationContext: initialization completed in 400 ms
12-Nov-2017 17:07:27.536 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.servlet.DispatcherServlet.initServletBean FrameworkServlet 'dispatcher': initialization started
12-Nov-2017 17:07:27.540 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.prepareRefresh Refreshing WebApplicationContext for namespace 'dispatcher-servlet': startup date [Sun Nov 12 17:07:27 CST 2017]; parent: Root WebApplicationContext
12-Nov-2017 17:07:27.542 INFO [RMI TCP Connection(2)-127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.loadBeanDefinitions Registering annotated classes: [class me.xiaofud.spring101.spittr.config.WebConfig]