SpringMVC 笔记篇

devtools/2024/9/18 12:51:17/ 标签: java, spring, mvc, 后端

1.1 执行流程

1.1.6 BeanNameUrlHandlerMapping ——> /test Bean对象

在1.1.5中我们提到了RequestMappingHandlerMapping这个Bean对象的初始化逻辑,除了这个Bean之外,其它的也会有自己的初始化逻辑。下面我们以BeanNameUrlHandlerMapping这个Bean为例。

首先我们先来查找到BeanNameUrlHandlerMapping这个类,并且进入。

我们可以看到BeanNameUrlHandlerMapping继承于AbstractDetectingUrlHandlerMapping这个类,跟进AbstractDetectingUrlHandlerMapping这个类之后我们又可以看到AbstractDetectingUrlHandlerMapping又继承于AbstractUrlHandlerMapping这个类,再次跟进,这个类又继承于AbstractHandlerMapping,再次跟进,这个类又继承于WebApplicationObjectSupport,再次跟进,这个类又继承于ApplicationObjectSupport,再次跟进,这个类最后实现了ApplicationContextAware这个接口,下面这几张截图就是整体的继承和实现关系。

  

 

 在ApplicationContextAware接口中有一个setApplicationContext()回调方法

 相当于BeanNameUrlHandlerMapping这个Bean对象在创建的过程中间它会来调setApplicationContext()方法的具体的实现。而这个方法具体的实现是在ApplicationObjectSupport这个类里面,因为它们之间存在继承关系,所以我们来到ApplicationObjectSupport这个类中找到这个方法。

而在这个方法里面它会调用initApplicationContext()这个方法,我们继续跟进一下这个方法

 从而继续调用里面的initApplicationContext()方法,继续跟进之后。

点击左侧的蓝色图标,找到具体的实现

再次点击左侧的蓝色图标 

所以BeanNameUrlHandlerMapping这个Bean对象它在初始化的时候会调用initApplicationContext()方法来进行初始化。而我们可以看到这个方法中还有一个detectHandlers()方法,跟进之后我们可以简单看一下这段代码,首先拿到Spring容器,之后会拿到所有Object类型的Bean的名字,然后根据名字一个一个去遍历,然后就把每个Bean的名字给解析出来

跟进一下里面解析名字的方法determineUrlsForHandler()

点击左侧图标

这个方法里面要求说Bean的名字必须要以"/"开头 ,这里面并没有考虑类型之类的问题,它只关心名字必须以"/"开头,只要满足条件就会被筛选出来,我们再回到刚才的方法中。

满足条件的Bean会被当做是一个Handler,并且调用registerHandler()方法,跟进过去

 点击for循环内的registerHandler()方法,跟进

来到这个方法之后往下拉

这些满足条件的Bean就会被注册到一个Map里面(handlerMap) 

举个例子,下面这种的Controller就满足上面的条件,名字以"/"开头,但是现在它还不能去处理请求,这涉及到了adapter(后面再说)

java">
import org. springframework.stereotype.Component;@Component("/test")
public class XXXBeanNameController {}

它收到请求之后就根据这个"/test",找到了这个Bean,但是找到了这个Bean要实现什么方法呢,我们需要实现一个接口 

java">import org. springframework. web. servlet. ModelAndView;
import org. springframework. web. servlet. mvc. Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component("/ test")
public class XXXBeanNameController implements Controller {@Overridepublic ModeLAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception{System. out. println(" test kanglingfeng");return null;}
}

这样我们就可以成功运行了。除了实现Controller接口之外,还可以实现HttpRequestHandler接口

java">import org. springframework. web. servlet. ModelAndView;
import org. springframework. web. servlet. mvc. Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;@Component("/ test")
public class XXXBeanNameController implements HttpRequestHandler{@Overridepublic void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException{System. out. println(" test kanglingfeng");}
}

我们来归纳一下这套流程

首先SpringMVC接收到一个请求之后(/test),根据这个test就能够找到对应的Bean对象,也就是能找到XXXBeanNameController 这个对象,找到这个对象之后,SpringMVC会把这个对象传进来,也就是下面代码中的supports(Object handler),传进来之后,判断这个类的类型是不是HttpRequestHandler接口,如果是,SpringMVC就会继续调用下面的handle方法

 把它接收的请求传给这个handle方法,然后handle方法就会把这个Bean对象进行强制转换,然后直接调用XXXBeanNameController里面的handleRequest()方法,从而去处理请求。


http://www.ppmy.cn/devtools/104422.html

相关文章

QT实战项目之音乐播放器

项目效果演示 myMusicShow 项目概述 在本QT音乐播放器实战项目中,开发环境使用的是QT Creator5.14版本。该项目实现了音乐播放器的基本功能,例如开始播放、停止播放、下一首播放、上一首播放、调节音量、调节倍速、设置音乐播放模式等。同时还具备搜索功…

Trying to update a textarea with string from an OpenAI request

题意:把从 OpenAI 请求中得到的字符串更新到一个文本区域中。 问题背景: Can anyone assist me with an issue Im facing. Im trying to append a string received back from an OpenAI request to an exisitng textarea element. The requested string…

浅谈对分布式锁的认识

分布锁常见的解决方案有:Reids实现、Zookeeper实现、MYSQL实现等。 一、基于Reids 使用SETNX命令,SETNX 是『SET if Not eXists』的简写。 将 key 的值设为 value ,当且仅当 key 不存在;若给定的 key 已经存在,则 S…

redis使用

redis是什么?如何理解5种基本数据结构分布锁、签到功能的使用掌握 string 的使用栈、队列掌握 list 的使用对象存储掌握 hash 的使用好友关系掌握 set 的使用排行榜掌握 zset 的使用 redis 是什么? redis(remote dictionary service&#xf…

esp8266根据httpserver状态,调用网络唤醒,实现一键开机

esp8266根据httpserver状态&#xff0c;调用网络唤醒&#xff0c;实现一键开机 一.开发板程序二. 服务端三.服务端状态变更 一.开发板程序 #include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiUdp.h> #include <ArduinoJson.h>/…

【Python】标准库的使用

文章目录 标准库日期计算字符串操作剑指offer 58&#xff0c;翻转单词顺序思路 leetcode 796&#xff0c;旋转字符串思路 leetcode 2255&#xff0c;统计是给定字符串前缀的字符串数目思路 文件查找工具 Python 通过模块来体现“库” 降低了程序猿的学习成本提高了程序的开发效…

浅谈【数据结构】图-最短路径问题

目录 1、最短路径问题 2、迪杰斯特拉算法 3、算法的步骤 谢谢帅气美丽且优秀的你看完我的文章还要点赞、收藏加关注 没错&#xff0c;说的就是你&#xff0c;不用再怀疑&#xff01;&#xff01;&#xff01; 希望我的文章内容能对你有帮助&#xff0c;一起努力吧&#xff0…

Uniapp 调用aar、jar包

废话 坑是真的多&#xff0c;官方文档简陋到可以忽略不计。 大概流程 1. 新建一个Android模块&#xff0c;需要用这个模块打包成aar 2. 用这个模块引用uniapp-v8-release.aar以及你需要用到的aar、jar&#xff0c;用不到则忽略这步 坑一&#xff1a;不要直接放到这个模块的…

gateway的学习

1.网关的作用 1.负载均衡 2.过滤器的使用 1.通过配置文件实现的过滤器 2.代码逻辑层面实现全局过滤器 //全局过滤器代码逻辑实现 Component //Order(1):注解配置过滤器的执行顺序 public class GlobalFilter implements GatewayFilter, Ordered {/*** 处理当前请求&#xff0c;…

大模型技术 | 基于 Langchain 和 Streamlit,构建多 PDF RAG 聊天机器人

与 PDF 互动是很酷的。你可以与你的笔记、书籍和文档等进行聊天。 本文将帮助你构建一个基于 Multi RAG Streamlit 的 Web 应用程序&#xff0c;通过对话 AI 聊天机器人来读取、处理和互动PDF数据。 以下是该应用程序的工作步骤&#xff0c;用简单的语言进行说明。 配置必要的…

41°29‘29.06“ N 12°31‘25.08“ E表示什么含义?

"412929.06" N" 是一个地理坐标&#xff0c;具体含义如下&#xff1a; 41 表示纬度的度数。29 表示纬度的分&#xff0c;1度等于60分。29.06" 表示纬度的秒&#xff0c;1分等于60秒。 这个坐标表示北纬41度29分29.06秒&#xff0c;是一个具体的位置点在地…

GPT说【网络协议实践:HTTP】如何从服务器上发送一个pdf文件给客户端。

要在 Flask 中处理客户端请求 PDF 文件并返回该文件&#xff0c;可以使用 send_file 或 send_from_directory 函数。假设已经有一个 PDF 文件&#xff0c;并且这个文件位于服务器上 static/pdf 目录中&#xff0c;你可以按照以下步骤来实现。 使用 send_file 函数返回 PDF 文件…

部署project_exam_system项目——及容器的编排

&#xff08;一&#xff09;安装docker、编辑daemon.json文件、安装docker-compose编排容器、启动docker 1.环境准备 [rootdocker--1 ~]# rz -Erz waiting to receive.[rootdocker--1 ~]# lsanaconda-ks.cfg docker.sh[rootdocker--1 ~]# source docker.sh [rootdocker--1 ~…

UNO小游戏2

前言 hello&#xff0c;大家好我是文宇。最近也是抽出时间更一期了。 bug还是很多&#xff08;恼&#xff09;&#xff0c;所以就当个乐子看看&#xff0c;反正后面还会有的&#xff0c;先把这玩意儿发了再说。 正文 #include<bits/stdc.h> #include<windows.h>…

【unity游戏开发】Blender导出到Unity,带texture

【背景】 上一篇完成了将Mixamo的动画应用到blender的fbx模型中。但是默认配置导出fbx又导入Unity后发现Texture都没了(mesh和rig都在)。如何将Texture也一并导入呢? 【要点】 Blender导出后的FBX展开Mesh的名称不是文件名称,而是同Blender中的Mesh名称。可以根据这一点…

C# 迭代器

yield return 的核心逻辑和继承两个接口实现其中的方法是一样的 迭代器是一种设计模式 yield return 只需要继承一个IEnumerable接口 1.先获取in后面这个对象的 IEnumerator&#xff0c;会调用对象其中的GetEnumerator方法 来获取 2.执行得到这个IEnumerator对象中的 MoveNe…

【Python零基础】文件使用和异常处理

文章目录 前言一、从文件中读取数据二、向文件中写入数据三、异常四、存储数据总结 前言 本篇笔者将展示Python如何处理文件数据&#xff0c;包括文件内容的读取和写入操作&#xff0c;以及程序运行时异常模块的处理方式&#xff0c;保证我们写出健壮的代码。 一、从文件中读取…

K8S Job

在Kubernetes中&#xff0c;Job是一个非常重要的资源控制器&#xff0c;用于运行一次性任务或批处理任务。这些任务在完成后通常不需要持续运行&#xff0c;而是执行完毕后即终止。 一、基本概念 Kubernetes Job控制器是用于运行一次性任务的API对象。它负责启动指定数量的Po…

图为科技闪耀双展,AI之星智领未来

图为科技同期闪耀2024AGIC深圳(国际)通用人工智能大会与深圳国际电子展&#xff0c;晋升AI领域新星。 人工智能爆炸时代&#xff0c;每一场科技盛会的召开都预示着行业的新风向与无限可能。 作为边缘计算与人工智能领域的佼佼者&#xff0c;图为科技携带前沿技术与创新产品&a…

python 实现一个简单的网页爬虫程序

最近在学习python&#xff0c;以下为网页爬虫代码&#xff0c;供参考 1、爬取指定网页的标题和所有的连接 2、并将这些信息保存到一个文件中。 前置&#xff1a;因使用到网页相关的功能&#xff0c;故需导入requests、BeautifulSoup 库来完成 #导入网页相关的库 import requ…