SpringBoot--SpringMVC自动配置
SpringMVC自动配置
1.SpringBoot官方文档对SpringMVC的默认配置:
Inclusion of
ContentNegotiatingViewResolverandBeanNameViewResolverbeans.- 自动配置了ViewResolver(视图解析器:根据方法返回值得到视图对象,试图对象决定如何渲染)
ContentNegotiatingViewResolver组合所有的视图解析器- 如何定制:我们可以给自己的容器添加一个视图解析器,自动的将其组合进来
Support for serving static resources, including support for WebJars (covered later in this document)).
- 静态资源文件夹路径,webjars
Automatic registration of
Converter,GenericConverter, andFormatterbeans.自动注册了
Converter类型转换器 :String ===> 封装进去UserFormatter格式化器 :2017-12-17 ===> Datepublic void addFormatters(FormatterRegistry registry) {
ApplicationConversionService.addBeans(registry, this.beanFactory);
}
public static void addBeans(FormatterRegistry registry, ListableBeanFactory beanFactory) {
Set<Object> beans = new LinkedHashSet();
beans.addAll(beanFactory.getBeansOfType(GenericConverter.class).values());
beans.addAll(beanFactory.getBeansOfType(Converter.class).values());
所以springboot同时也将容器中所有的
ConverterFormatterGenericConverter加入到组件中自己添加的格式化转换器,我们只需要放在容器中即可
Support for
HttpMessageConverters(covered later in this document).HttpMessageConverters : SpringMVC用来转换Http请求和相应的;(User对象转换成Json数据)
只有一个构造器给ObjectProvider赋值 ,所以参数直接从容器中获取, HttpMessageConverters 是从容器中确定,获取所有的HttpMessageConverter
private final ObjectProvider<HttpMessageConverters> messageConvertersProvider;
public WebMvcAutoConfigurationAdapter(…… ObjectProvider<HttpMessageConverters> messageConvertersProvider…………) {
this.messageConvertersProvider = messageConvertersProvider;
自己添加的HttpMessageConverter,只需要直接放入容器(@Bean、@Component)
Automatic registration of
MessageCodesResolver(covered later in this document).- 定义错误代码的生成规则
Static
index.htmlsupport.- 静态首页访问
Custom
Faviconsupport (covered later in this document).- favicon.ico
Automatic use of a
ConfigurableWebBindingInitializerbean (covered later in this document).我们可以配置一个
ConfigurableWebBindingInitializer来替换默认的;(添加到容器)初始化WebDataBinder
请求数据===JavaBean 将数据绑定成为我们要封装的对象,用到类型转换器,格式化器等等
ConfigurableWebBindingInitializer
public void initBinder(WebDataBinder binder) {
binder.setAutoGrowNestedPaths(this.autoGrowNestedPaths);
if (this.directFieldAccess) {
binder.initDirectFieldAccess();
}
org.springframework.boot.autoconfigure.web:web的所有自动场景;
2. 扩展SpringMVC
If you want to keep those Spring Boot MVC customizations and make more MVC customizations (interceptors, formatters, view controllers, and other features), you can add your own @Configuration class of type WebMvcConfigurer but without @EnableWebMvc.
<mvc:view-controller path="/hello" view-name="success"/>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/hello"/>
<bean></bean>
</mvc:interceptor>
</mvc:interceptors>
编写一个配置类(Configuration),是WebMvcConfigurer 类型,不能标注@EnableWebMvc
@Configuration
//WebMvcConfigurer接口中有很多方法的对应的是以往Springmvc配置文件中的属性
//使用其来扩展SpringMVC的功能
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//浏览器发送/jiat请求来到 success
registry.addViewController("/jiat").setViewName("success");
}
}
原理:
- WebMvcAutoConfiguration是SpringMVC的自动配置类
- 在做其他自动配置时会导入;@Import(EnableWebMvcConfiguration.class)
- 容器中所有的WebMvcConfiguration都会起作用
- 我们的配置类也会被调用
3.全面接管SpringMVC(在我们的WebMvcConfigurer配置类上加上一个@EnableWebMvc)
SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己配置,所有的SpringMVC模块自动配置全部失效,包括静态资源
@EnableWebMvc能使默认配置生效的原因
- 添加了@EnableWebMvc后会为容器导入一个WebMvcConfigurationSupport配置类,添加相应组件到容器中
@Import({DelegatingWebMvcConfiguration.class}) //导入一个DelegatingWebMvcConfiguration
public @interface EnableWebMvc {
//为容器添加一个WebMvcConfigurationSupport
@Configuration(
proxyBeanMethods = false
)
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
- 而 WebMvcAutoConfiguration 的注解上有一个“@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})”,当存在如果容器中存在WebMvcConfigurationSupport对象时,WebMvcAutoConfiguration 自动配置失效
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnWebApplication(
type = Type.SERVLET
)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
//如果容器中存在WebMvcConfigurationSupport对象,则以下所有配置不生效
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
@AutoConfigureOrder(-2147483638)
@AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {
接管SpringMVC总结:
- @EnableWebMvc将WebMvcConfigurationSupport组件导入容器中
- WebMvcConfigurationSupport只是SpringMVC的最基本功能
- 用户可以在实现基本功能的WebMvcConfigurationSupport上定制自己的webmvc
4. 如何修改SpringBoot的默认配置
模式:
- SpingBoot在自动配置很多组件的时候,先看容器中有没有用户自己配置的(@Bean、@Component)如果有就用用户配置的,没有才自动配置,如果有些组件可以多个(ViewResolver)将用户配置的和自己默认的组合起来
- 在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展
- 在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置
SpringBoot--SpringMVC自动配置的更多相关文章
- spring-boot spring-MVC自动配置
Spring MVC auto-configuration Spring Boot 自动配置好了SpringMVC 以下是SpringBoot对SpringMVC的默认配置:==(WebMvcAuto ...
- SpringBoot源码学习系列之SpringMVC自动配置
目录 1.ContentNegotiatingViewResolver 2.静态资源 3.自动注册 Converter, GenericConverter, and Formatter beans. ...
- SpringBoot扩展SpringMVC自动配置
SpringBoot中自动配置了 ViewResolver(视图解析器) ContentNegotiatingViewResolver(组合所有的视图解析器) 自动配置了静态资源文件夹.静态首页.fa ...
- 【SpringBoot】SpringBoot与SpringMVC自动配置(五)
本文介绍SpringBoot对Spring MVC自动配置,SpringBoot自动配置原理可以参考:[SpringBoot]SpringBoot配置与单元测试(二) 首先新建一个SpringBoot ...
- 9 Web开发——springmvc自动配置原理
官方文档目录: https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#boot-features-sp ...
- springboot mvc自动配置(三)初始化mvc的组件
所有文章 https://www.cnblogs.com/lay2017/p/11775787.html 正文 在springboot mvc自动配置的时候,获得了DispatcherServlet和 ...
- 关于SpringBoot的自动配置和启动过程
一.简介 Spring Boot简化了Spring应用的开发,采用约定大于配置的思想,去繁从简,很方便就能构建一个独立的.产品级别的应用. 1.传统J2EE开发的缺点 开发笨重.配置繁多复杂.开发效率 ...
- 4_2.springboot2.x配置之springmvc自动配置
1.Spring MVC auto-configuration 查看官方文档: Spring Boot为Spring MVC提供了自动配置,适用于大多数应用程序. 自动配置在Spring的默认值之上添 ...
- springboot08(springmvc自动配置原理)
MVC WebMvcAutoConfiguration.java @ConditionalOnMissingBean(name = "viewResolver", value = ...
- Springboot MVC 自动配置
Springboot MVC 自动配置 官方文档阅读 https://docs.spring.io/spring-boot/docs/current/reference/html/web.html#w ...
随机推荐
- python数据统计分析
1. 常用函数库 scipy包中的stats模块和statsmodels包是python常用的数据分析工具,scipy.stats以前有一个models子模块,后来被移除了.这个模块被重写并成为了 ...
- Spring杂谈 | Spring中的AutowireCandidateResolver
接口定义 用于推断一个特定的beanDefinition是否能作为指定依赖的候选者的策略接口 public interface AutowireCandidateResolver { // 默认情况下 ...
- python gdal 读取栅格数据
1.gdal包简介 gdal是空间数据处理的开源包,其支持超过100种栅格数据类型,涵盖所有主流GIS与RS数据格式,包括Arc/Info ASCII Grid(asc),GeoTiff (tiff) ...
- Python网络爬虫练习
1. 豆瓣top250电影 1.1 查看网页 目标网址:https://movie.douban.com/top250?start=0&filter= start=后面的数字从0,25,50一 ...
- Linux内核驱动学习(一)编写最简单Linux内核模块HelloWorld
文章目录 准备工作 什么是内核模块 编写 hello.c 模块编译 相关指令 测试结果 模块加载 模块卸载 准备工作 在进行以下操作前,首先我准备了一台电脑,并且安装了虚拟机,系统是Ubuntu16. ...
- Tomcat服务器的下载与安装,修改端口号
安装及简单配置Tomcat服务器: 1.登录www.apache.org 网站,之后点击Projects , 点击Project List,找到Tomcat. 2.点击Tomcat之后,之后进入Tom ...
- Linux 物理卷(PV)、逻辑卷(LV)、卷组(VG)管理
(一)相关概念 逻辑卷是使用逻辑卷组管理(Logic Volume Manager)创建出来的设备,如果要了解逻辑卷,那么首先需要了解逻辑卷管理中的一些概念. 物理卷(Physical Volume, ...
- JMeter基于HTML测试报告的生成
1第一步: 下载ant,搭建ant环境(path的环境变量) 在path中添加ANT_HOME\bin 验证是否搭建成功Lcmd中输入ant 提示这个说明搭建成功. 第二步: 1.jmerer的目录C ...
- myeclipse 2017 CI 破解
1.首先下载破解文件(破解前先关闭myeclipse),链接:https://pan.baidu.com/s/1CPFH4Nga3xITSyj-BCVeaw 提取码:mkvz 2.将下载的破解文件解压 ...
- $releasever 不正确解析
[nginx] gpgcheck=0 baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ name=nginx repo 这 ...