Spring源码探究1.0

简单看了看写了些,Spring最简单的一个实现,实现了什么具体如下


一、 初始化阶段

步骤序号初始化阶段核心方法主要作用关键数据结构变化
1加载配置文件doLoadConfig()读取contextConfigLocation指定的配置文件(如application.propertiescontextConfig中加载scanPackage
2包扫描doScanner()根据scanPackage扫描所有.class文件classNames保存所有全限定类名
3IoC 实例化doInstance()@GPController@GPService标注的类进行实例化ioc中放入 Bean 实例
4依赖注入(DI)doAutowired()@GPAutowired字段注入依赖ioc内对象完成属性赋值
5初始化映射关系doInitHandlerMapping()建立 URL → Method 的映射关系handlerMapping填充
6初始化完成init()结束框架启动完成,可接收请求MVC 框架可工作

doLoadConfig


扫描相关类

IoC 实例化
String className : classNames
来我自己聊聊
注解扫描
GPController
clazz 反射实例化,然后添加进容器,name 和calss

GPService
@GPService 获取value
如果有,优选name
2.正常注入
3.接口获取
2️⃣ 为什么要把接口也放进 IOC?
这一步的目的只有一个:@GPAutowired
private UserService userService;

key = “com.xxx.UserService”
value = UserServiceImpl 的实例

private void doInstance() { if(classNames.isEmpty()){return;} try { for (String className : classNames) { Class<?> clazz = Class.forName(className); if(clazz.isAnnotationPresent(GPController.class)) { //key提取出来了,把value也搞出来 String beanName = toLowerFirstCase(clazz.getSimpleName()); Object instance = clazz.newInstance(); ioc.put(beanName, instance); }else if(clazz.isAnnotationPresent(GPService.class)){ //1、在多个包下出现相同的类名,只能寄几(自己)起一个全局唯一的名字 //自定义命名 String beanName = clazz.getAnnotation(GPService.class).value(); if("".equals(beanName.trim())){ beanName = toLowerFirstCase(clazz.getSimpleName()); } //2、默认的类名首字母小写 Object instance = clazz.newInstance(); ioc.put(beanName, instance); //3、如果是接口 //判断有多少个实现类,如果只有一个,默认就选择这个实现类 //如果有多个,只能抛异常 for (Class<?> i : clazz.getInterfaces()) { if(ioc.containsKey(i.getName())){ throw new Exception("The " + i.getName() + " is exists!!"); } ioc.put(i.getName(),instance); } }else{ continue; } } }catch (Exception e){ e.printStackTrace(); } }

依赖注入
思路
扫描bean下的,方法,是否有对应注解,如果有,那么根据ioc容器的类型名字拿取bean
然后反射bean下的变量进行set

初始化HandlerMapping
映射,拿取conroller的注解,拿取method上的注解,拿出url 。然后映射,url对应method。

public class GPDispatchServlet extends HttpServlet

HttpServlet 是 Java EE(Jakarta EE)中提供的HTTP 协议专用 Servlet 基类,它封装了对 HTTP 请求的处理逻辑。GPDispatchServlet 继承 HttpServlet 的核心作用是复用 HttpServlet 提供的成熟 Web 请求处理骨架,无需从零实现 Servlet 的底层规范,直接获得处理 HTTP GET/POST 等请求的能力。

在这份手写简易 Spring MVC 框架的代码中,GPDispatchServlet 并非一个普通的 Servlet,而是整个 MVC
框架的核心前端控制器(Front Controller),这是一种经典的设计模式应用。 它的核心职责是统一接收所有客户端的 HTTP
请求,作为请求入口的 “总闸门”,再将请求分发给对应的业务处理组件(如 DemoAction 中的具体方法),而非为每个业务功能创建单独的
Servlet。

委派
思路,继承servlet
获取前端控制器,写doget 和post 写调用器
作用
拿取request的url,跟urlmap进行对应。如果对应上。那么进入执行
1.参数处理
2.根据method拿去calss的名字,然后进行反射invoke

url对应
http://localhost:8080/gupaoedu_vip_spring_war/demo/query?name=Jerry
params = {ParameterMap@3166} size = 1
“name” -> {String[1]@3173} [“Jerry”]
很有意思的参数处理


GPRequestParam
运行

控制器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1156056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

usblyzer在项目初期协议分析中的应用:入门必看

usblyzer实战指南&#xff1a;从零理解USB通信&#xff0c;快速定位项目初期的“黑盒”问题在嵌入式开发的世界里&#xff0c;你有没有遇到过这样的场景&#xff1f;一个精心设计的STM32板子焊好了&#xff0c;固件也烧录成功。你满怀期待地插上电脑——结果设备管理器毫无反应…

IAR使用教程:超详细版菜单功能逐项解析

IAR 使用教程&#xff1a;菜单功能全解析与实战技巧在嵌入式开发的世界里&#xff0c;工具链的选择往往决定了项目的成败。面对日益复杂的微控制器架构和严苛的实时性要求&#xff0c;一个强大、稳定且高效的集成开发环境&#xff08;IDE&#xff09;显得尤为重要。IAR Embedde…

嵌入式系统中单精度浮点转换实战

嵌入式系统中单精度浮点转换实战&#xff1a;从底层原理到工程落地在一片寂静的工业现场&#xff0c;PLC正在读取来自PT100传感器的温度信号。ADC采样值是3278——一个再普通不过的12位整数。但工程师真正关心的不是这个数字本身&#xff0c;而是它背后代表的物理意义&#xff…

jscope实时波形显示优化策略:深度解析

jscope 实时波形显示优化实战&#xff1a;从数据采集到丝滑渲染的全链路调优你有没有遇到过这样的场景&#xff1f;在调试一个电机控制板时&#xff0c;ADC采样频率明明设到了10ksps&#xff0c;可打开 jscope 看波形——画面卡顿、跳变剧烈、甚至直接“断连”。刷新率低得像老…

工业传感器采集系统:CubeMX+FreeRTOS配置详解

从零构建工业级传感器采集系统&#xff1a;CubeMX FreeRTOS 实战全解析在一间现代化的智能工厂里&#xff0c;成百上千个温度、压力、振动传感器实时监控着设备运行状态。一旦某个电机轴承温度异常升高&#xff0c;系统必须在毫秒内捕捉到这一信号&#xff0c;并触发预警流程—…

工业传感器采集系统:CubeMX+FreeRTOS配置详解

从零构建工业级传感器采集系统&#xff1a;CubeMX FreeRTOS 实战全解析在一间现代化的智能工厂里&#xff0c;成百上千个温度、压力、振动传感器实时监控着设备运行状态。一旦某个电机轴承温度异常升高&#xff0c;系统必须在毫秒内捕捉到这一信号&#xff0c;并触发预警流程—…

教学实验中Multisim数据库未找到的图解说明

当Multisim打不开元器件库&#xff1a;一次教学实验中的“数据库未找到”排障实录那天上午第三节课&#xff0c;电子技术实验室的几个学生急匆匆跑来&#xff1a;“老师&#xff0c;Multisim启动后弹窗说‘数据库未找到’&#xff0c;根本没法画电路&#xff01;”这不是第一次…

STM32与PC端串口通信协议设计实战案例

STM32与PC串口通信协议设计实战&#xff1a;从原理到高可靠帧结构的完整实现在嵌入式开发的世界里&#xff0c;STM32 串口通信几乎是一个“标配组合”。无论是调试信息输出、参数配置&#xff0c;还是传感器数据上传&#xff0c;UART总能以极低的硬件成本完成任务。但如果你只…

AI 会写作业了,但学生还会思考吗?

最近&#xff0c;张文宏医生的一段视频被频繁推送到我面前。他说得略微有争议&#xff08;当然也可能是媒体只截了其中一部分&#xff09;&#xff1a;如果年轻医生没有经过系统训练&#xff0c;就直接相信 AI 给出的诊断&#xff0c;这是不负责任的。这句话&#xff0c;看似在…

S32DS使用实战案例:首个工程从零实现流程

从零开始玩转S32DS&#xff1a;我的第一个S32K144工程实战手记 你有没有过这样的经历&#xff1f;买回一块崭新的S32K144开发板&#xff0c;插上电脑却不知道从何下手。官网下载了S32 Design Studio&#xff08;简称S32DS&#xff09;&#xff0c;打开后面对一堆菜单和向导一头…

利用multisim仿真电路图进行频率响应测试:操作指南

用Multisim做频率响应测试&#xff1a;从原理到实战的完整指南你有没有遇到过这样的情况&#xff1f;电路焊好了&#xff0c;通电也正常&#xff0c;可一测信号——高频部分莫名其妙衰减了&#xff0c;相位还乱飘。回头翻设计&#xff0c;才发现某个电容选大了十倍&#xff0c;…

理性看世界:别再用“救孩子”阻断原创游戏-原创游戏开发任重道远卓伊凡

理性看世界&#xff1a;别再用“救孩子”阻断原创游戏-原创游戏开发任重道远卓伊凡这篇文章&#xff0c;我想聊一个近几年反复被拿出来炒作的话题——电子游戏举报问题。这几年&#xff0c;我们终于开始拥有一些真正意义上的优秀国产游戏。 它们至少做到了两点&#xff1a;用户…

探索Python融合地学:一文教会你下载ERA5-Land数据

下载ERA5-Land数据的准备工作注册并获取CDS API密钥&#xff1a;访问Copernicus Climate Data Store (CDS) 官网&#xff08;https://cds.climate.copernicus.eu/&#xff09;&#xff0c;完成账号注册。在用户页面找到API密钥&#xff0c;保存为$HOME/.cdsapirc文件&#xff0…

.NET 8 + WPF 打造的数控机床仿真平台

项目概述一个基于 .NET 8.0 开发的数控机床仿真平台&#xff0c;作为早期项目 MachineSimulation.DX 的演进版本&#xff0c;专注于机床结构、工装&#xff08;fixture&#xff09;和刀具&#xff08;tool&#xff09;的编辑、加载与三维可视化。项目采用 WPF MVVM 架构&#…

从阅文招聘JD看网文平台算法化-网文平台拥抱科技·卓伊凡

从阅文招聘JD看网文平台算法化-网文平台拥抱科技卓伊凡 “智能搜索”岗位往往比“推荐算法”更能暴露一家内容平台的真实技术路线——因为搜索是内容分发的“入口层基础设施”&#xff0c;一旦它智能化&#xff0c;后面推荐、增长、风控、审核&#xff0c;都会被同一套数据与模…

Figma中文界面插件:让专业设计工具说中文

Figma中文界面插件&#xff1a;让专业设计工具说中文 【免费下载链接】figmaCN 中文 Figma 插件&#xff0c;设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在被Figma满屏的英文菜单搞得头晕眼花&#xff1f;想要快速上手这款专业设计工具…

剖析大数据领域Spark的任务调度算法

剖析大数据领域Spark的任务调度算法 关键词:Spark、任务调度、DAG调度器、任务集调度器、资源分配、调度策略、性能优化 摘要:本文深入剖析Apache Spark的任务调度机制,从架构设计到实现细节进行全面解析。文章首先介绍Spark调度系统的整体架构,然后详细分析DAG调度器和任务…

【PyTorch】2024保姆级安装教程-Python-(CPU+GPU详细完整版)-

PyTorch 安装指南&#xff08;CPU/GPU 版本&#xff09;环境准备确保已安装 Python&#xff08;推荐 3.8-3.10 版本&#xff09;和 pip 包管理工具。可通过以下命令验证&#xff1a;python --version pip --version对于 GPU 版本&#xff0c;需提前安装 CUDA 工具包&#xff08…

资深Android开发工程师职位深度解析:基于广州极飞科技股份有限公司的职位需求

广州极飞科技股份有限公司 资深Android开发工程师(J11083) 职位信息 工作职责: 1.参与 Android 端的核心产品研发,包含需求分析、方案设计、开发实现、性能优化完整流程; 2.开发及维护基础服务组件,调研 Android 平台的***并推广使用; 3.与硬件、算法、设计团队紧密合作,…

CCS20高可用性架构构建:实际案例分享

从理论到实战&#xff1a;CCS20如何实现毫秒级无感切换&#xff1f;在轨道交通信号控制室里&#xff0c;一次控制器重启可能意味着列车延误&#xff1b;在变电站中&#xff0c;哪怕一秒的通信中断都可能导致保护误动。面对这些“零容忍”停机的关键系统&#xff0c;高可用性&am…