Spring 全家桶之 Spring Boot 2.6.4(五)- WebMvcAutoConfiguration(Part C)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Spring 全家桶之 Spring Boot 2.6.4(五)- WebMvcAutoConfiguration(Part C)

三、Spring Boot Web MVC 自动配置

Spring Boot 官方文档 Web 模块 的自动配置说明

Spring MVC Auto-configuration

Spring Boot 已经自动配置好了Spring MVC,可以使用Web Starter快速创建启动并运行。

Spring Boot 官方文档列出了以下这些关于MVC的配置

Spring Boot provides auto-configuration for Spring MVC that works well with most applications.

The auto-configuration adds the following features on top of Spring’s defaults:

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
  • Support for serving static resources, including support for WebJars (covered later in this document).
  • Automatic registration of Converter, GenericConverter, and Formatter beans.
  • Support for HttpMessageConverters (covered later in this document).
  • Automatic registration of MessageCodesResolver (covered later in this document).
  • Static index.html support.
  • Automatic use of a ConfigurableWebBindingInitializer bean (covered later in this document).

视图解析器

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans. 自动配置了视图解析器,视图解析器的作用是根据方法的返回值得到视图对象,视图对象再决定是否需要转发或者重定向。

视图解析器源码分析,入口是org.springframework.boot.autoconfigure.web.servlet包下的 自动配置类WebMvcAutoConfiguration,所有MVC的自动配置都在该类中,该类中包含了三个返回视图解析器resolver的方法,除了一个默认的defaultViewResolver方法外,另外两个就是自动配置的ContentNegotiatingViewResolver and BeanNameViewResolver

83bbc104093d48439c7bd75cdd02fa4f_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

查看ContentNegotiatingViewResolver的resolveViewName方法是如何解析视图的

image.png

resolveViewName方法中通过getCandidateViews获取视图并保存在一个View的List中。

getCandidateViews方法会遍历所有的视图解析器来解析视图,将解析出来的视图保存到列表中

image.png

ContentNegotiatingViewResolver类的作用就是组合所有视图解析器解析视图。

ContentNegotiatingViewResolver先new了一个保存视图解析器的列表

image.png

调用视图解析器的初始化方法,通过BeanFactoryUtils从容其中获取所有的视图解析器保存在集合中

image.png

这样的话我们就可以自己给容器中添加一个视图解析器,自动的加进ContentNegotiatingViewResolver视图解析器的列表中

自定义视图解析器实现

public class LilithViewResolver implements ViewResolver {
    @Override
    public View resolveViewName(String viewName, Locale locale) throws Exception {
        System.out.println("自定义的视图解析器LilithViewResolver");
        return null;
    }
}
复制代码

通过配置类,将自定义的视图解析器注册到Spring容器中

@Configuration
public class ViewResolverConfig {
    // 将自定义的视图解析器注册到Spring容器中
    @Bean
    public ViewResolver lilithViewResolver(){
        return new LilithViewResolver();
    }
}
复制代码

debug查看容器中是否在视图解析器的列表中,在doDispatch方法上打断点

image.png

根据Debug的信息来看,自定义的视图解析器已经被添加到视图解析器的列表中了

静态资源配置

静态资源的配置原理和使用可以参考 Spring 全家桶之 Spring Boot 2.6.4(五)- Web Develop(Part A)中的 Spring Boot对静态资源的映射规则 部分

自动注册Converter和Formatter格式化器

  • Automatic registration of Converter, GenericConverter, and Formatter beans.

类型转换器的作用是将前端请求中的String类型的数据转化成基本数据类型或者自定义对象;Formatter格式化的作用是将String时间转换成Date类型

自动配置类往容器中添加了一个组件FormattingConversionService,这个组件就包含了Converter功能和Formatter功能。

image.png

自定义格式转换器

首先定义一个注解@BoolFormat

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.PARAMETER})
public @interface BooleanFormat {
}
复制代码

接着定义一个转换器类BooleanFormatter,继承Formatter接口,实现格式转换功能,并将该类注册到容器中,该类会将values数组中的值全部转换true,数组之外的为false。

@Component
public class BooleanFormatter implements Formatter<Boolean> {
    private final String[] values = {"是", "YES", "Y", "yes", "Yes", "ok", "OK", "Ok" , "好", "哦了"};
    @Override
    public Boolean parse(String text, Locale locale){
        return Arrays.asList(values).contains(text);
    }
    @Override
    public String print(Boolean object, Locale locale) {
        return object ? "true" : "false";
    }
}
复制代码

再定义一个工厂类LilithBooleanFormatterFactory,继承AnnotationFormatterFactory

@Component
public class LilithBooleanFormatterFactory implements AnnotationFormatterFactory<BooleanFormat> {
    @Resource
    private BooleanFormatter booleanFormatter;
    @Override
    public Set<Class<?>> getFieldTypes() {
        Set<Class<?>> set=new HashSet<>();
        set.add(Boolean.class);
        return set;
    }
    @Override
    public Parser<?> getParser(BooleanFormat annotation, Class<?> fieldType) {
        return booleanFormatter;
    }
    @Override
    public Printer<?> getPrinter(BooleanFormat annotation, Class<?> fieldType) {
        return booleanFormatter;
    }
}
复制代码

新建一个BoolController测试格式转换器是否能正常工作

@RestController
public class BoolController {
    @RequestMapping("/bool")
    public String hallo(@BooleanFormat Boolean value){
        return value.toString();
    }
}
复制代码

重启应用

image.png

测试values数组以外的值,传入ooook

image.png

返回false

支持HTTP消息转换器

Spring MVC uses the HttpMessageConverter interface to convert HTTP requests and responses.

Spring MVC 使用HttpMessageConverter来转换HTTP请求和响应

官方文档 自定义HttpMessageConverter

image.png

自定义HttpMessageConverter的方式与自定义ViewResolver的方式一样,只需要将自定义的HttpMessageConverter加入容器中即可。

Spring Boot是如何自动配置HttpMessageConverter的?

WebMvcAutoConfiguration自动配置类中有一个WebMvcAutoConfigurationAdapter自动配置适配器,这个类的有参构造方法中导入了HttpMessageConverter

image.png

HttpMessageConverter实现了Iterable<HttpMessageConverter<?>> 接口

image.png

从容器中获取所有的HttpMessageConverter然后添加到自动配置类中

自动注册 MessageCodesResolver

Spring MVC has a strategy for generating error codes for rendering error messages from binding errors: MessageCodesResolver. If you set the spring.mvc.message-codes-resolver-format property PREFIX_ERROR_CODE or POSTFIX_ERROR_CODE, Spring Boot creates one for you (see the enumeration in DefaultMessageCodesResolver.Format).

主要是用来定义错误代码生成规则的

MessageCodeResolver在自动配置类中的配置方式

image.png

欢迎页配置

  • Static index.html support. 欢迎页的配置原理和使用可以参考 Spring 全家桶之 Spring Boot 2.6.4(五)- Web Develop(Part A)中的 Spring Boot 欢迎页 部分

自动使用 ConfigurableWebBindingInitializer

自动配置类中关于ConfigurableWebBindingInitializer的定义方式。可以自定义一个ConfigurableWebBindingInitializer来替换默认的。

image.png

getConfigurableWebBindingInitializer方法会首先从容器中获取ConfigurableWebBindingInitializer,如果找不到就会调用父类的getConfigurableWebBindingInitializer方法

image.png

父类中这个方法就是初始化所有的WebDataBinder,WebDataBinder的作用就是将请求数据转换成为Java Bean

image.png

initBinder就是初始化WebDataBinder的方法

org.springframework.boot.autoconfigure.web.servlet. DispatcherServletAutoConfiguration包含了Web模块所有的自动配置。


相关文章
|
2天前
|
缓存 前端开发 Java
【Spring】——SpringBoot项目创建
SpringBoot项目创建,SpringBootApplication启动类,target文件,web服务器,tomcat,访问服务器
|
1月前
|
监控 Java 数据库连接
详解Spring Batch:在Spring Boot中实现高效批处理
详解Spring Batch:在Spring Boot中实现高效批处理
158 12
|
1月前
|
安全 Java 测试技术
详解Spring Profiles:在Spring Boot中实现环境配置管理
详解Spring Profiles:在Spring Boot中实现环境配置管理
82 10
|
26天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
88 5
|
1月前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
45 2
|
2月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
81 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
2月前
|
监控 Java 应用服务中间件
Spring和Spring Boot的区别
Spring和Spring Boot的主要区别,包括项目配置、开发模式、项目依赖、内嵌服务器和监控管理等方面,强调Spring Boot基于Spring框架,通过约定优于配置、自动配置和快速启动器等特性,简化了Spring应用的开发和部署过程。
75 19
|
2月前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
109 2
|
2月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
247 1
|
2月前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
35 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现