SpringBoot自动配置SpringMVC原理

本文深入探讨SpringBoot如何自动配置SpringMVC,解析关键配置类WebMvcAutoConfiguration和DispatcherServletAutoConfiguration。文章阐述了SpringBoot在特定条件下初始化WebMVC环境,并详细介绍了DispatcherServlet的自动配置过程,包括ServletRegistrationBean的工作原理和ApplicationContextAware接口的作用。此外,还讨论了SpringBoot与其他SpringMVC配置的区别,并提供了一个字符串到日期的参数转换器示例。
摘要由CSDN通过智能技术生成

从前面学习SpringBoot自动配置原理我们知道,在SpringBoot启动加载时会预先从指定配置文件中读取可以配置的Config类,这些Config配置类可以在工程中通过尽可能少的配置就能让常用的框架组件发布并使用起来,那么SpringBoot是怎么帮我们做到这一点的呢?由于可配置的Config非常多,我们就选择我们最熟悉的WebMVC对应的Config进行详细解读,学习之后就可以自行举一反三了。

(一)SpringBoot怎么自动配置SpringMVC?

在学习SpringBoot怎么自动配置各种框架之前,我们先回想一下SpringBoot预先读取的可配置Config类有哪个是与WebMVC相关的?经过比对我们发现在Key=EnableAutoConfiguration,Value=WebMvcAutoConfiguration就是关于SpringBoot自动配置WebMVC的可配置类,关于SpringBoot自动配置WebMVC的玄机也正是在这个配置类里面。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\

于是,我们必须好好看一下这个可配置类到底做了什么事情,能让SpringBoot启动完成之后也自动初始化好了一个WebMVC的环境。

点开可以看到这个可配置类上有很多注解修饰,这些注解分别限定在某些条件满足或不满足情况下,spring才会初始化并配置这个Config类。关于这些注解和文字解释如下:

//声明为配置类,并且Bean的方法不进行代理
@Configuration(proxyBeanMethods = false)

//判断当前环境是一个SERVLET环境,也就是说是Web环境下这个配置类才生效
@ConditionalOnWebApplication(type = Type.SERVLET)

//判断当前环境是否含有Servlet,DispatcherServlet,WebMvcConfigurer实例(前面SpringMVC章节零XML方式介绍的接口,
//类似引入web.xml的Java实例),这些都是WebMVC必不可少的组件,只有这些都存在这个配置类才生效
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })

//判断当前环境是否存在WebMvcConfigurationSupport,如果不存在这个配置类才生效
//为什么这里不存在WebMvcConfigurationSupport时才能让配置类生效呢?因为这个接口是一个自定义配置WebMVC的接口,
//如果实现了这个接口就意味着开发者自己手动进行了webMVC的配置,那么SpringBoot就不再帮你自动配置了,防止了配置冲突。
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

//自动配置顺序:数值越低越优先配置
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)

//WebMVC配置的核心注解,主要是对DispatcherServlet进行Java配置,以及对任务执行和校验器进行Java配置。
//当这个配置类生效之后,就会接着进行Dispat
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值