当前位置: 首页 > news >正文

SpringMVC 笔记篇

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(后面再说)


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

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

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接口

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()方法,从而去处理请求。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • jmeter的聚合报告生成测试报告的方法(生成.HTML模式)
  • 十一. 常用类
  • Gamma基线估算
  • 关于OBI 在unity URP环境下使用的正确步骤
  • 鸿蒙项目签名配置
  • 请解释Java中的对象克隆机制,并讨论浅拷贝和深拷贝的区别。什么是Java中的封装?请举例说明如何通过封装实现数据隐藏和访问控制。
  • 推荐10个开源且实用的大模型
  • 财富知识的认知(一)
  • element input限制输入框只能输入数字
  • Vue 3 Composition API 中如何正确添加表单项副本到数组
  • 快讯 | 阿里开源Qwen2-VL视觉大模型:刷新多模态AI性能
  • 【华为】轻松get!eNSP登录无线AC Web界面的新姿势
  • 反向迭代器:reverse_iterator的实现
  • 嵌入式Linux C应用编程指南-高级I/O(速记版)
  • 科研绘图系列:R语言组合图形绘图
  • 2017 年终总结 —— 在路上
  • C# 免费离线人脸识别 2.0 Demo
  •  D - 粉碎叛乱F - 其他起义
  • Javascript 原型链
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Javascript设计模式学习之Observer(观察者)模式
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • MySQL QA
  • React Transition Group -- Transition 组件
  • Swoft 源码剖析 - 代码自动更新机制
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 分布式任务队列Celery
  • 回顾 Swift 多平台移植进度 #2
  • 简析gRPC client 连接管理
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用agvtool更改app version/build
  • 使用docker-compose进行多节点部署
  • 使用Swoole加速Laravel(正式环境中)
  • 树莓派 - 使用须知
  • 我感觉这是史上最牛的防sql注入方法类
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 怎么将电脑中的声音录制成WAV格式
  • 最近的计划
  • #传输# #传输数据判断#
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (pytorch进阶之路)扩散概率模型
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (黑马点评)二、短信登录功能实现
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core 成都线下面基会拉开序幕
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存