news 2026/7/15 0:22:49

Spring源码探究1.0

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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
运行

控制器

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/26 13:39:24

HTTP性能测试工具-wrk

1、前言 性能测试对软件测试的重要性在于它可以评估软件在特定负载条件下的性能表现&#xff0c;包括响应时间、吞吐量、并发用户数、资源利用率等。通过性能测试&#xff0c;可以识别并解决可能存在的性能问题&#xff0c;提高软件的可靠性、稳定性和可伸缩性。性能测试还可以…

作者头像 李华
网站建设 2026/6/26 13:54:51

TensorLPP:张量局部保持投影算法详解与实现

在机器学习和计算机视觉领域,降维技术是处理高维数据的重要手段之一。传统的降维方法如PCA(主成分分析)关注全局方差最大化,而LPP(Locality Preserving Projections,局部保持投影)则更注重保留数据的局部邻域结构,这使得它在流形学习任务中表现出色。 然而,当数据本身…

作者头像 李华
网站建设 2026/7/2 14:09:48

MATLAB多列图例函数columnlegend详解与实现

引言 在MATLAB绘图中,当曲线或图例项数量较多时,默认的legend函数只会生成单列图例,导致图例框过长,甚至遮挡图形内容或超出图形区域。这时,我们希望能将图例排列成多列形式,既美观又节省空间。然而,MATLAB原生legend并不直接支持多列布局。 columnlegend 就是一个非常…

作者头像 李华
网站建设 2026/7/14 22:48:42

Keil uVision5嵌入式C开发:新手教程(从零配置环境)

从零开始搭建 Keil uVision5 嵌入式开发环境&#xff1a;新手也能看懂的实战指南 你是不是也曾经面对一块 STM32 开发板&#xff0c;手握资料却无从下手&#xff1f;打开 Keil 看着一堆弹窗和选项&#xff0c;心里直打鼓&#xff1a;“这玩意儿到底怎么用&#xff1f;”别急—…

作者头像 李华
网站建设 2026/7/9 20:54:25

javascript数据类型转换-转换为数字型

第一种转换方式&#xff0c;使用Number语法是Number(数据或者存储数据的变量)let a 12 console.log(Number(a),typeof Number(a))如果是不能转换的类型&#xff0c;返回值是NaN如果内容是空&#xff0c;返回值是0如果转换的是布尔值&#xff0c;true返回1&#xff0c;false返回…

作者头像 李华
网站建设 2026/7/12 16:48:32

ST7789V硬件时序详解:系统学习初始化流程

深入ST7789V&#xff1a;从硬件时序到初始化流程的系统性解析在嵌入式显示开发中&#xff0c;点亮一块屏幕看似简单——接上电源、写几条命令、刷点颜色。但当你真正动手时&#xff0c;却常常遇到花屏、黑屏、白屏、颜色错乱等问题。这些问题的背后&#xff0c;往往不是代码写错…

作者头像 李华