springboot 为 spring mvc 提供的自动配置及对自动配置的一些自定义定制(大体思路)
★ Spring Boot主流支持两个MVC框架:
Spring MVC(基于Servlet)
Spring WebFlux(基于Reactive,属于响应式API)
★ Spring Boot为Spring MVC提供了哪些自动配置
Spring MVC的自动配置主要由WebMvcAutoConfiguration自动配置类负责提供支持。Spring Boot为Spring MVC自动配置大致提供了如下功能:- 引入了ContentNegotiatingViewResolver和BeanNameViewResolver。(两个典型的视图解析器:负责将String类型的逻辑视图名解析成实际View对象)- 对服务器静态资源提供支持,包括对WebJars的支持。- 自动注册 Converter、GenericConverter、Formatter这些Bean。(类型转换、格式化器)- 支持使用HttpMessageConverters来注册HttpMessageConverter。HttpMessageConverter它主要负责完成String类型的请求参数与JSON数据、XML数据之间的相互转换。HttpMessageConverter最常用的实现是基于Jackson或Jackson XML- 自动注册 MessageCodeResolver。- 支持静态的index.html首页。- 自定义Favicon支持。用于为应用指定图标- ConfigurableWebBindingInitializer Bean的自动使用。上面这些内容,基本上就是Spring MVC开发时所需的各种基础Bean,因此Spring Boot为Spring MVC提供大量的自动配置。
★ 对自动配置进行定制
如果觉得springboot对spring mvc 的一些自动配置不满意,我们还可以对这些自动配置进行定制。
▲ 定制方式一:
若要在保留自动配置的基础上增加一些自定义的Spring MVC配置(例如添加拦截器、格式化器、视图控制器等),则可通过实现自己的WebMvcConfigurer类,并使用@Configuration注解修饰该类、但不要使用@EnableWebMvc注解修饰。实现该类的如下方法:- addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers):添加参数解析器- addFormatters(FormatterRegistry registry):添加格式化器- addInterceptors(InterceptorRegistry registry):添加拦截器。- addViewControllers(ViewControllerRegistry registry):添加视图控制器- addResourceHandlers: 添加额外的静态资源处理目录。
代码演示:
若要在保留自动配置的基础上增加一些自定义的Spring MVC配置,可以这些写,这里只是弄个框架。
▲ 定制方式二:
如果要实现自定义RequestMappingHandlerMapping、RequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver代替自动配置自动配置的这些Bean。RequestMappingHandlerMapping :根据@RequestMapping注解负责请求映射到指定控制器的指定处理方法。RequestMappingHandlerAdapter :它是配合RequestMappingHandlerMapping使用。ExceptionHandlerExceptionResolver: 它主要做异常解析,它主要为@ExceptionHandler注解修饰的异常处理方法来提供支持。要通过定义WebMvcRegistrations Bean来注册它们。
代码演示:
▲ 定制方式三:
本质:用自定义的Bean,取代Spring Boot为Spring MVC自动配置的Bean配置自定义的ConfigurableWebBindingInitializer,它会取代自动配置的WebBindingInitializerWebBindingInitializer它也是Spring MVC本身的API,它的作用就是为每个请求都初始化一个WebBinder,而WebBinder就负责完成数据绑定。
代码演示:
★ 全面接管(放弃自动配置)——极少使用
如果使用@Configuration和@EnableWebMvc注解同时修饰自己的Spring MVC配置类。这意味着完全关闭了Spring Boot为Spring MVC的自动配置,开发者必须手动完成所有关于Spring MVC的配置工作。