一、整合SpringMVC分析
web容器在启动的时候,会扫描每个jar包下的META-INF/services/javax.servlet.ServletContainerInitializer
文件,加载这个文件里面指定的类SpringServletContainerInitializer
spring的应用一启动就会加载WebApplicationInitializer
接口下的所有组件并创建对象
WebApplicationInitializer
接口下有三个抽象类
AbstractContextLoaderInitializer
抽象类:
调用createRootApplicationContext()
方法来创建根容器
AbstractDispatcherServletInitializer
抽象类
调用createServletApplicationContext()
方法创建一个web的IOC容器
调用createDispatcherServlet()
方法创建了DispatchServlet
将创建的DispatchServlet
添加到ServletContext
中
AbstractAnnotationConfigDispatcherServletInitializer
抽象类
使用注解的方式配置的DispatcherServlet
初始化器
该类重写AbstractContextLoaderInitializer
父类的createRootApplicationContext()
方法来创建根容器。调用getRootConfigClasses()
方法传入一个配置类
该类还重写了AbstractDispatcherServletInitializer
父类的createServletApplicationContext()
方法来创建web的IOC容器。获取配置类注册到IOC容器中。
以注解方式来启动SpringMVC,需要继承AbstractAnnotationConfigDispatcherServletInitializer
,然后实现抽象方法指定DispatcherServlet
的配置信息
二、注解方式整合SpringMVC
自定义容器初始化器
/*web容器启动的时候创建对象,调用方法来初始化容器以及前端控制器*/
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/*获取根容器的配置类,相当于Spring的配置文件,用来创建父容器*/
protected Class<?>[] getRootConfigClasses() {
return new Class[]{RootConfig.class};
}
/*获取web容器的配置类,相当于SpringMVC的配置文件,用来创建子容器*/
protected Class<?>[] getServletConfigClasses() {
return new Class[]{AppConfig.class};
}
/*获取DispatcherServlet的映射信息*/
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
子容器配置类
//SpringMVC只扫描Controller,子容器
@ComponentScan(value = "springMVC", includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
})
public class AppConfig {
}
父容器配置类
//Spring的容器不扫描Controller,必须禁用默认的过滤规则才会生效,父容器
@ComponentScan(value = "springMVC", excludeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
public class RootConfig {
}
Service
层
@Service
public class HelloService {
public String sayHello(String name){
return "hello " + name;
}
}
Controller
层
@Controller
public class HelloController {
@Autowired
HelloService helloService;
@ResponseBody
@RequestMapping("/hello")
public String hello(){
String hello = helloService.sayHello("张三");
return hello;
}
}
三、定制SpringMVC
使用@EnableWebMvc
开启SpringMVC定制配置功能,相当于在xml文件中使用<mvc:annotation-driven/>
标签
@ComponentScan(value = {"controller", "service", "config", "springMVC"}, includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
@EnableWebMvc
public class AppConfig {
}
配置组件,包括视图解析器、视图映射、静态资源映射、拦截器等等
@ComponentScan(value = {"controller", "service", "config", "springMVC"}, includeFilters = {
@ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Controller.class})
}, useDefaultFilters = false)
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter{
//定制视图解析器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/", ".jsp");
}
//定制静态资源访问
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
/*相当于在xml配置文件中使用<mvc:default-servlet-handler>标签,
* 将SpringMVC处理不了的请求交给Tomcat,这样静态资源就可以访问了*/
configurer.enable();
}
//定制拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}