上篇我们学习了《36-Spring MVC的RestTemplate》,从本篇开始我们学习Spring MVC的原理及Spring MVC如何配置。
3.1 Spring MVC的工作原理
我们学习Spring MVC的REST支持的原理应通过DispatchServlet出发,在Spring Boot中通过DispatcherServletAutoConfiguration定义DispatcherServlet的Bean,并通过DispatcherServletRegistrationBean 的Bean来注册DispatcherServlet到Servlet容器中。
DispatcherServlet在处理(doDispatch方法)的时候将主要的的功能代理给下面的两个Bean:
- HandlerMapping:RequestMappingHandlerMapping它主要负责获取web请求与handler(控制器方法)之间的映射;我们当前使用的实现为:RequestMappingHandlerMapping,它获取RequestMappingInfo作为请求和Handler方法之间的映射,RequestMappingInfo信息是从@RequestMapping注解中获取的;负责PathMatchConfigurer(路径匹配)设置;负责Interceptor(拦截器)的设置;负责ContentNegotiationManager(内容协商管理器)的设置;负责CORS(跨域资源共享)的设置。
- HandlerAdapter:RequestMappingHandlerAdapter它主要负责从映射中获取的Handler并调用;我们当前使用的实现为:RequestMappingHandlerAdapter,它通过HandlerMapping的getHandler方法从RequestMappingInfo获取到HandlerMethod并执行它,HandlerMethod即我们实际要执行的控制器方法。负责HttpMessageConverter设置;负责WebBindingInitializer设置;负责HandlerMethodArgumentResolver(控制器方法的参数)设置;负责HandlerMethodReturnValueHandler(控制器方法返回值)设置;
DispatcherServlet支持多个HandlerMapping,从HandlerMapping的getHandler方法可以获得不同类型的handler,而HandlerAdapter的supports方法声明只处理符合它支持的handler类型,RequestMappingHandlerAdapter只支持类型为HandlerMethod的handler。
3.2 如何配置MVC
上面HandlerMapping和HandlerAdapter负责的内容都是需要我们做配置的内容,幸运的是Spring MVC给我们提供了@EnableWebMvc注解,它通过导入DelegatingWebMvcConfiguration中的配置,为我们做好了默认配置。Spring Boot虽然没有直接使用@EnableWebMvc,但是在Spring Boot的WebMvcAutoConfiguration.EnableWebMvcConfiguration(继承DelegatingWebMvcConfigurations)中做了等同于@EnableWebMvc的配置。除了WebMvcAutoConfiguration.EnableWebMvcConfiguration中的配置,WebMvcAutoConfiguration为我们做了更多的配置,我们会在下面细讲。
我们可以通过实现WebMvcConfigurer接口来定制HandlerMapping和HandlerAdapter:
@Configuration
public class WebConfiguration implements WebMvcConfigurer {
//...
}
重载WebMvcConfigurer接口的方法实现对Spring MVC配置的定制。如果你完全不想使用Spring Boot提供的自动配置,只需在配置类上加上@EnableWebMvc即可,但是这一般不是我们需要的。
我们将不再使用继承WebMvcConfigurerAdapter类的方法进行配置,自Spring 5.0开始,Spring全面支持 Java 8作为基线,WebMvcConfigurerAdapter的实现内容已经由WebMvcConfigurer默认方法替代,WebMvcConfigurerAdapter将被废弃。
当然除了上面的配置形式外,有些配置是可以通过配置Bean来实现的,我们在后面也会针对讲解。
本文暂时没有评论,来添加一个吧(●'◡'●)