Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

  • 计算机基础

  • 框架|中间件

    • Spring

      • Spring-控制反转IOC
      • Spring-面向切面编程AOP
      • Spring常见面试问题
      • SpringMVC常见面试问题
      • SpringMVC分析
        • 注册 Controller 的几种方式
      • SpringBoot自动配置原理
      • Spring三级缓存解决循环依赖
      • Spring事务测试分析
    • MyBatis

    • MySQL

    • Redis

    • 消息队列

    • Zookeeper

    • Git

    • Maven

    • Gradle

  • 架构

  • 后端
  • 框架|中间件
  • Spring
Marvel
2022-09-08
目录

SpringMVC分析

# SpringMVC分析

草稿

# 注册 Controller 的几种方式

Contoller 的定义方式有 2 种类型,3 种实现。

  • 2 种类型:BeanName、@Controller,体现在 HandlerMapping 上

  • 3 种实现:实现 HttpRequestHandler 接口、实现 Controller 接口、加 @Controller

⭐ 实现 Controller 接口,重写 handleRequest 方法

@Component("/test1.do")
public class BeanNameController implements Controller {
	@Override
	public ModelAndView hadnleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		// 处理业务
        return null;
	}
}
1
2
3
4
5
6
7
8

⭐ 实现 HttpRequestHandler 接口,重写 handeRequest 方法

@Component("/test2.do")
public class HandleController implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) {
        // 处理业务
    }
}
1
2
3
4
5
6
7

⭐ 使用 @Controller 注解(最常用)

@Controller
public class TestController {
	@RequestMapping("/test3.do")
    public void handleRequest() {
        // 处理业务
    }
}
1
2
3
4
5
6
7

为什么要设计 HandlerMapping?

主要用于解决找到通过不同方式注册的 Controller,这里是是一个策略模式,遍历 HandlerMappings 拿到所有不同 handlerMapping 的实现,分别进行处理。

HandlerMapping 包含两类,对应 Controller 注册的两种方式

  • RequeustMappingHandlerMapping:获取通过 @Controller 注解注入的 Controller
  • BeanNameUrlHandlerMapping:获取通过 BeanName 方式注入的 Controller

所以说,HandlerMapping 主要就是用于找到 Controller。

HandlerAdapter 包含三类,对应 Controller 注册的三种实现

这里应该是适配器模式

  • RequestMappingHandlerAdapter

如果是用 @Controller 注解注册的,那么需要通过反射调用里面的方法;如果通过 BeanName 的方法注册的,那么通过 bean 对象调用方法。

SpringMVC 找到 Controller 流程:

  1. 扫描整个项目(Spring来完成),定义一个 map 集合
  2. 拿到所有带有 @Controller 注解的类
  3. 遍历类里面所有的方法对象,判断方法是否加了 @RequestMapping 注解
  4. 把 @RequestMapping 注解中的 URI 作为 key,方法作为 value 放入 map 集合。
  5. 根据用户发送的请求,拿到请求中的 URI
  6. 使用请求的 uri 作为 key 去 map 中获取,看看是否有返回值
编辑 (opens new window)
#Spring#SpringMVC#框架
上次更新: 2023/08/20, 21:21:52
SpringMVC常见面试问题
SpringBoot自动配置原理

← SpringMVC常见面试问题 SpringBoot自动配置原理→

最近更新
01
位运算
05-21
02
二叉树
05-12
03
Spring三级缓存解决循环依赖
03-25
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Marvel
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式