SpringBoot - SpringMVC自动配置以及原理
双休日过了,学习继续。不学习的人生有什么意义!
一.Spring MVC 自动配置
查阅SpringBoot官方文档,SpringBoot帮我们自动配置了以下组件。
- Inclusion of
ContentNegotiatingViewResolver
andBeanNameViewResolver
beans.- 自动配置了ViewResovler(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?)
-
ContentNegotiatingViewResolver
:组合所有的视图解析器 - 如何定制:我们给容器添加一个视图解析器,它就会自动的组合起来
- Support for serving static resources, including support for WebJars (covered later in this document)).
- 静态资源文件路径webjars
- Automatic registration of
Converter
,GenericConverter
, andFormatter
beans.-
Converter
:转换器:类型转换组件。 -
Formatter
格式化:2018.5.10 ==Date;
-
- Support for
HttpMessageConverters
(covered later in this document).-
HttpMessageConverters
:SpringMVC用来转换Http请求和响应的;User-json - 是从容器中确定;获取所有的
HttpMessageConverters
;如果要定义的话,就把自己的组件注册到容器中。
-
- Automatic registration of
MessageCodesResolver
(covered later in this document).-
MessageCodesResolver
:定义错误代码生成规则
-
- Static
index.html
support. - Custom
Favicon
support (covered later in this document). - Automatic use of a
ConfigurableWebBindingInitializer
bean (covered later in this document).-
ConfigurableWebBindingInitializer
:Web数据绑定器,请求数据绑定到JavaBean中。如果没有自定绑定器,它会调用默认的绑定器。
-
模式小结
- SpringBoot在自动配置很多组件的时候,都会先判断用户有没有自己配置(@Bean,@Component),如果有,就使用用户的配置,没有就自动配置。但是有些组件可以有多个(ViewResolver),那么SpringBoot就将用户配置和自己默认的配置组合起来。
二.如何修改SpringBoot的默认配置
1.添加修改SpringBoot的默认配置
官方文档原文:
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own @Configuration
class of type WebMvcConfigurer
but without @EnableWebMvc
. If you wish to provide custom instances of RequestMappingHandlerMapping
, RequestMappingHandlerAdapter
, or ExceptionHandlerExceptionResolver
, you can declare a WebMvcRegistrationsAdapter
instance to provide such components.
解释一下,就是假如你需要扩展配置SpringBoot的话,你只需要创建一个配置类继承,给这个类添加 @Configuration
标注,并继承WebMvcConfigurer
,并且不能有@EnableWebMvc
。或者申明一个WebMvcRegistrationsAdapter实例并且将其加入到容器当中。
以下为一种添加配置的示例:
/**
* @author BaoZhou
* @date 2018/5/14
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//浏览器请求/baozhou,映射到success
registry.addViewController("/baozhou").setViewName("success");
}
}
原理:
我们的扩展配置类会和自动配置类放入同一个容器,SpringBoot在装载配置的时候,会将所有配置都取出,所以我们的配置和SpringBoot都会生效。当然,以上代码只是对WebMvc的扩展配置,其他配置可以参考以上模式,只要找到相对应的XXXconfigurer接口进行实现即可。
2.全面托管SpringBoot的默认配置(几乎不用)
继续官方文档:
If you want to take complete control of Spring MVC, you can add your own @Configuration
annotated with @EnableWebMvc
.
解释,假如我们要完全自己配置SpringMVC,我只要在我们的配置文件上添加@EnableWebMvc,就可以做到完全托管。实际工作中基本不会用到,但是这里也是通过阅读源码加深下对于SpringBoot的实现方式的理解。
原理:
此处我们看一下源码:
@EnableWebMvc :
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}
WebMvcAutoConfiguration:
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) //这句很重要
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class,
ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {
我们再来看下DelegatingWebMvcConfiguration.class
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
正是因为@EnableWebMvc
导入了WebMvcConfigurationSupport,所以就导致了WebMvcAutoConfiguration的失效。
3.小结
有关于 SpringMVC自动配置以及原理就学习到这里,喜欢的可以点一个赞!