SpringBoot - SpringMVC自动配置以及原理

双休日过了,学习继续。不学习的人生有什么意义!

一.Spring MVC 自动配置

查阅SpringBoot官方文档,SpringBoot帮我们自动配置了以下组件。

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
    1. 自动配置了ViewResovler(视图解析器:根据方法的返回值得到视图对象(View),视图对象决定如何渲染(转发?重定向?)
    2. ContentNegotiatingViewResolver:组合所有的视图解析器
    3. 如何定制:我们给容器添加一个视图解析器,它就会自动的组合起来
  • Support for serving static resources, including support for WebJars (covered later in this document)).
    1. 静态资源文件路径webjars
  • Automatic registration of Converter, GenericConverter, and Formatter beans.
    1. Converter:转换器:类型转换组件。
    2. Formatter 格式化:2018.5.10 ==Date;
  • Support for HttpMessageConverters (covered later in this document).
    1. HttpMessageConverters:SpringMVC用来转换Http请求和响应的;User-json
    2. 是从容器中确定;获取所有的 HttpMessageConverters;如果要定义的话,就把自己的组件注册到容器中。
  • Automatic registration of MessageCodesResolver (covered later in this document).
    1. MessageCodesResolver:定义错误代码生成规则
  • Static index.html support.
  • Custom Favicon support (covered later in this document).
  • Automatic use of a ConfigurableWebBindingInitializer bean (covered later in this document).
    1. ConfigurableWebBindingInitializer :Web数据绑定器,请求数据绑定到JavaBean中。如果没有自定绑定器,它会调用默认的绑定器。

模式小结

  1. 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自动配置以及原理就学习到这里,喜欢的可以点一个赞!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,902评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,037评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,978评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,867评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,763评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,104评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,565评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,236评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,379评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,313评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,363评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,034评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,637评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,719评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,952评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,371评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,948评论 2 341

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,267评论 0 10
  • PLEASE READ THE FOLLOWING APPLE DEVELOPER PROGRAM LICENSE...
    念念不忘的阅读 13,420评论 5 6
  • 没曾想再次回到这个地方,已经是29岁的我了,就像是昨天下午还在上面玩耍来着,我说的是一块住在家乡山梁上的大石...
    龙囧子阅读 395评论 1 6
  • 跑完步气喘吁吁躺在落叶上真的好惬意,满眼美得陶醉 躺一秋落叶 任汗,把我划成一块一块 断断续续的喘息 落叶缤纷,飘...
    forget1111阅读 191评论 2 11
  • 美学是研究人与世界审美关系的一门学科,也就是说美学研究的对象是审美活动。 生活美学在这些年间被反复提及。 什么是生...
    陪你BetterMe阅读 5,128评论 3 14