SpringBoot——MVC自动配置原理

简介: SpringBoot——MVC自动配置原理

目录


官方文档描述:


扩展SpringMVC


容器中实现一个视图解析器


转换器和格式化器


修改SpringBoot的默认配置


全面接管SpringMVC


Spring Boot 为 Spring MVC 提供了自动配置,适用于大多数应用程序。


官方文档描述:

自动配置在 Spring 的默认值之上添加了以下功能:

image.png

从官方描述解析:

If you want to keep Spring Boot MVC features and you want to add 
additionalMVC configuration (interceptors, formatters, view controllers, 
and other features), you can add your own 
@Configuration class of type WebMvcConfigurer but without @EnableWebMvc.

扩展SpringMVC

由于WebMvcConfigurer是个接口

image.png

创建一个MyMvcConfig实现这个接口

image.png

image.png

之前我们学的视图解析器是我们手动配置

image.png

ViewResolver  实现了视图解析器接口的类,就看做是视图解析器

image.png

搜索ContentNegotiatingViewResolver,找到如下方法resolveViewName!找到对应的视图解析代码

image.png

从 getCandidateViews中看到它是把所有的视图解析器拿来,进行遍历循环

image.png

结论:ContentNegotiatingViewResolver 这个视图解析器就是用来组合所有的视图解析器的

image.png

可以看出它是从容器中去找视图解析器,我们也可以在容器中实现一个视图解析器!

容器中实现一个视图解析器

1、我们在主程序中去写一个视图解析器;

image.png

2、如何看我们自己写的视图解析器是否起了作用呢?

我们给 DispatcherServlet 中的 doDispatch方法 加个断点进行调试一下,因为所有的请求都会走到这个方法中!

image.png

3、我们启动我们的项目,然后随便访问一个页面,看一下Debug信息,找到this

image.png

4、找到视图解析器,我们看到我们自己定义的就在这里了;

image.png

所以说,我们如果想要使用diy定制的东西,我们只需要给容器中添加这个组件就好了,SpringBoot就会帮我们自动装配!

转换器和格式化器

找到格式化转换器:

image.png

点进去可以看到

image.png

如果配置了自己的格式化方式,就会注册到Bean中生效,我们可以在配置文件中配置日期格式化的规则:可以看到在我们的Properties文件中,我们可以进行自动配置它!

image.png

image.png

修改SpringBoot的默认配置

image.png

image.png

结论:我们要扩展SpringMVC,官方就推荐我们这么去使用,既保SpringBoot留所有的自动配置,也能用我们扩展的配置!


分析一下原理:


1、WebMvcAutoConfiguration 是 SpringMVC的自动配置类,里面有一个类WebMvcAutoConfigurationAdapter


2、这个类上有一个注解,在做其他自动配置时会导入:@Import(EnableWebMvcConfiguration.class)


3、我们点进EnableWebMvcConfiguration这个类看一下,它继承了一个父类:DelegatingWebMvcConfiguration


这个父类中有这样一段代码:

image.png

4、我们可以在这个类中去寻找一个我们刚才设置的viewController当做参考,发现它调用了一个

protected void addViewControllers(ViewControllerRegistry registry) {
    this.configurers.addViewControllers(registry);
}

5、我们点进去看一下

public void addViewControllers(ViewControllerRegistry registry) {
    Iterator var2 = this.delegates.iterator();
    while(var2.hasNext()) {
        // 将所有的WebMvcConfigurer相关配置来一起调用!包括我们自己配置的和Spring给我们配置的
        WebMvcConfigurer delegate = (WebMvcConfigurer)var2.next();
        delegate.addViewControllers(registry);
    }
}

结论:所有的WebMvcConfiguration都会被作用,不止Spring自己的配置类,我们自己的配置类当然也会被调用


全面接管SpringMVC

全面接管即:SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己去配置!


只需在我们的配置类中要加一个@EnableWebMvc。


我们开发中,不推荐使用全面接管SpringMVC


1、这里看到它是导入了一个类,继续点进去看

image.png

2、它继承了一个父类 WebMvcConfigurationSupport

image.png

3、回顾一下Webmvc自动配置类

image.png

总结:@EnableWebMvc将WebMvcConfigurationSupport组件导入进来;

而导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能!

相关文章
|
8天前
|
前端开发 Java 数据库
SpringBoot入门(3) - 对Hello world进行MVC分层
SpringBoot入门(3) - 对Hello world进行MVC分层
24 1
SpringBoot入门(3) - 对Hello world进行MVC分层
|
7天前
|
前端开发 Java 数据库
SpringBoot入门(3) - 对Hello world进行MVC分层
本文介绍了如何在Spring Boot项目中实现MVC分层架构,通过将代码划分为controller、service、dao和entity四个部分,实现高内聚低耦合的设计。示例项目包括用户增删查改功能,详细展示了各层的具体实现及运行测试。
26 11
|
6天前
|
前端开发 Java 数据库
SpringBoot入门(3) - 对Hello world进行MVC分层
SpringBoot入门(3) - 对Hello world进行MVC分层
13 2
|
14天前
|
Java Spring 容器
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【10月更文挑战第15天】在Spring Boot应用中,循环依赖是一个常见问题,当两个或多个Bean相互依赖时,会导致Spring容器陷入死循环。本文通过比较@RequiredArgsConstructor和@Lazy注解,探讨它们解决循环依赖的原理和优缺点。@RequiredArgsConstructor通过构造函数注入依赖,使代码更简洁;@Lazy则通过延迟Bean的初始化,打破创建顺序依赖。两者各有优势,需根据具体场景选择合适的方法。
35 4
|
2月前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
187 1
|
23天前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
25天前
|
XML 前端开发 Java
拼多多1面:聊聊Spring MVC的工作原理!
本文详细剖析了Spring MVC的工作原理,涵盖其架构、工作流程及核心组件。Spring MVC采用MVC设计模式,通过DispatcherServlet、HandlerMapping、Controller和ViewResolver等组件高效处理Web请求。文章还探讨了DispatcherServlet的初始化和请求处理流程,以及HandlerMapping和Controller的角色。通过理解这些核心概念,开发者能更好地构建可维护、可扩展的Web应用。适合面试准备和技术深挖
40 0
|
安全 Java 应用服务中间件
SpringBoot核心【基本配置】
基本配置 1.入口类和相关注解 2.定制Banner 2.1 修改banner图标 2.2 关闭banner 3.SpringBoot的配置文件 3.1 tomcat端口号修改 3.2 常规属性配置 3.3 类型安全的配置
SpringBoot核心【基本配置】
|
Java 应用服务中间件 Maven
传统maven项目和现在spring boot项目的区别
Spring Boot:传统 Web 项目与采用 Spring Boot 项目区别
483 0
传统maven项目和现在spring boot项目的区别
|
XML Java 数据库连接
创建springboot项目的基本流程——以宠物类别为例
创建springboot项目的基本流程——以宠物类别为例
150 0
创建springboot项目的基本流程——以宠物类别为例