一般springMVC使用xml来进行项目配置,当spring到3.2版本时,通过支持Servlet3.0规范,springMVC也可以通过代码来进行配置。
在servlet3.0规范中,容器会自己查找实现了javax.servlet.ServletContainerInitializer接口的类,并使用它来配置servlet容器。
spring提供了这个接口的实现SpringServletContainerInitializer,这个类会查找实现了WebApplicationInitializer的类并且让他们来完成配置。
Spring3.2引入了一个便利的基础实现AbstractAnnotationConfigDispatcherServletInitializer,这个类实现了WebApplicationInitializer,所以继承他就可以做到通过java代码实现servlet的上下文配置。
springmvc有两个关键的上下文配置,一个dispatcher上下文 ,一个spring上下文,servlet中对应的是dispatcherServlet和ContextLoaderListener。当dispatcherServlet启动的时候,会自动创建spring应用的上下文,并加载相应的配置和bean,这些bean主要是web相关的bean和组件。而ContextLoaderListener则负责加载后台中间层和数据层的组件。
首先编写一个配置dispatcher上下文的类,MvcConfig:
//声明为spring的配置类
@Configuration
//开启springMvc
@EnableWebMvc
//开启组件扫描,注意只扫描web相关的内容
@ComponentScan("com.wk.controller")
public class MvcConfig extends WebMvcConfigurerAdapter{
/**
* 配置jsp的视图解析器
* @return InternalResourceViewResolver
*/
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views");
viewResolver.setSuffix(".jsp");
viewResolver.setExposeContextBeansAsAttributes(true);
return viewResolver;
}
/**
* 启用servlet容器对静态资源的处理
* @param configurer 配置
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
注释写的很清楚,就不讲解了。
然后编写spring上下文的java配置文件,RootConfig:
@Configuration
//扫描bean,过滤web相关的
@ComponentScan(basePackages = {"com.wk"},
excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)
}
)
public class RootConfig {
}
最后编写实现了WebApplicationInitializer的实现类,WebAppInitializer:
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* 配置spring上下文
* @return config
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{RootConfig.class};
}
/**
* 配置dispatcher上下文
* @return config
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{MvcConfig.class};
}
/**
* 绑定dispatcher的映射路径
* @return paths
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
这样springmvc的配置就完成了,可以测试一下:
@RestController
public class TestController {
@GetMapping("/")
public String test(){
return "xxxxxx";
}
}