前期准备

我这里要写的是一个迷你版的Spring MVC,我将在一个干净的web工程开始开发,不引入Spring,完全通过JDK来实现。

我们先来看一眼工程:

工程代码结构

第一:在annotation包下,我将提供自定义的注解,为了方便理解,就和Spring MVC保持一致。


第二:为了模拟Spring MVC的方法调用链,我这里提供Controller/Service/Dao层进行测试。


第三:提供自己的DispatcherServlet完成核心处理逻辑。

关于自定义注解

JDK提供了几个元注解,比如:


  • @Documented : JavaDoc文档

  • @Target:标志此注解可以修饰在哪些地方,类,成员变量,方法...

  • @Retention:Annotation的生命周期,一般情况下,我们自定义注解的话,显然需要在运行期获取注解的一些信息。

看一下我这边的自定义注解:

模拟Spring MVC的@Controller注解

@Qualifier提供依赖注入

@RequestMapping提供URL地址处理映射

Dao层注解

Service层注解

编写核心控制器:DispatcherServlet

在Spring MVC中,DispatcherServlet是核心,下面我们来实现它。首先来说,Spring MVC中的DispatcherServlet说到底,还是HttpServlet的子类,因此我这边自己的DispatcherSerlvet需要extends HttpServlet。

pom.xml:

提供servlet依赖

看DispatcherServlet的定义:

DispatcherServlet


@WebServlet是什么?

其实,以前我们定义一个Servlet,需要在web.xml中去配置,不过在Servlet3.0后出现了基于注解的Servlet。

仔细观察,你会发现,这个DispatcherServlet是自启动,而且传入了一个参数。

要知道,在Spring MVC中,要想基于注解,需要在配置中指明扫描的包路径,就像这个样子:

<context:component-scan base-package="com.zfz.myspringmvc">

</context:component-scan>

为了方便,我这里就通过初始化参数直接将需要扫描的基包路径传入。

init初始化处理:


init()

其实,在init中,我们主要是完成了什么呢?

第一:我们应该去扫描基包下的类,得到信息A。

第二:对于@Controller/@Service/@Repository注解而言,我们需要拿到对应的名称,并初始化它们修饰的类,形成映射关系B。

第三:我们还得扫描类中的字段,如果发现有@Qualifier的话,我们需要完成注入。

第四:我们还需要扫描@RequestMapping,完成URL到某一个Controller的某一个方法上的映射关系C。

其实,Spring MVC的处理流程,就是类似这样的!

扫描基包:


扫描基包


注意,基包是X.Y.Z的形式,而URL是X/Y/Z的形式,需要转换。

实例化:


实例化


从这里你可以看出,我们完成了被注解标注的类的实例化,以及和注解名称的映射。

依赖注入:


依赖注入

以前,我们总是说Spring IOC,上面不就是在做这个事情么?

URL映射处理:


URL映射处理

URL,我们需要提取出来,映射到Controller的Method上。


doGet/doPost:


doGet/doPost

在doPost方法中,非常简单,我们只需要提取出URL,通过URL映射到Method上,然后通过反射的方式进行调用即可。

Make it run!

Controller层:


UserController

Service层:


UserService

UserServiceImpl

Dao层:

UserDao

UserDaoImpl

运行结果:

result

OK,到这里,一个迷你版的Spring MVC就开发完成了。

PS:如果觉得我的分享不错,欢迎大家随手点赞、转发。

Java团长

专注于Java干货分享

扫描上方二维码获取更多Java干货

手写一个迷你版Spring MVC框架相关推荐

  1. 如何手写一个迷你版的RPC

    点击上方"Java后端技术栈"关注 持续推送技术干货 前言 在实际后台服务开发中,比如订单服务(开发者A负责)需要调用商品服务(开发者B负责),那么开发者B会和A约定调用API,以 ...

  2. local tomcat 找不到springmvc里的包_唰唰的手撕一个简单的Spring Mvc 框架

    @[TOC] 自定义实现Spring Mvc框架 前言 在使用Spring Mvc时候我们需要配置一个中央处理器DispatcherServlet用于分发请求,根据url查找处理器,然后再根据处理器 ...

  3. 手写一个迷你版的 Tomcat 猫

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | J ...

  4. 手写一个迷你版的 Tomcat 喵【转】

    原文地址:https://blog.csdn.net/FYGu18/article/details/82921115 前言 Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交 ...

  5. 极光im java_java手写一个迷你版的Tomcat代码分享

    前言 Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道.这是一只神奇的猫,今天让我来抽象你,实现你! Write MyTomcat Tomcat是非常流行的Web Ser ...

  6. 手写一个迷你版的 Tomcat 喵

    前言 Write MyTomcat 2.1 MyRequest 2.2 MyResponse 2.3 MyServlet 2.4 ServletMapping 和 ServletMappingConf ...

  7. 【手写系列】写出我的第一个框架:迷你版Spring MVC

    你没有看错标题,今天,我将实现我人生中第一个框架,^_^ 前期准备 我这里要写的是一个迷你版的Spring MVC,我将在一个干净的web工程开始开发,不引入Spring,完全通过JDK来实现. 我们 ...

  8. 【手写系列】写一个迷你版的Tomcat

    前言 Tomcat,这只3脚猫,大学的时候就认识了,直到现在工作中,也常会和它打交道.这是一只神奇的猫,今天让我来抽象你,实现你! Tomcat Write MyTomcat Tomcat是非常流行的 ...

  9. 迷你版Spring MVC 实现

    2019独角兽企业重金招聘Python工程师标准>>> 迷你版Spring MVC 实现 本文参考自 写出我的第一个框架:迷你版Spring MVC ,写这篇文章用于个人学习的记录. ...

最新文章

  1. java面试时候算法题多吗_java程序员面试中最容易被问到的18个算法题(附答案!)...
  2. HTML5 Canvas编写五彩连珠(3):设计
  3. python_bomb----函数高级特性(生成器)
  4. 张洋:浅析PageRank算法
  5. Java中的goto实现
  6. 【AI白身境】深度学习必备图像基础
  7. 提升销售人员的信息处理能力
  8. JAVA中反射的实现过程和作用分别是什么?
  9. wxWidgets:支持国际化
  10. lua把userdata写入mysql_Lua教程(十九):userdata
  11. 我的博客是怎么自定义的
  12. uva 10127——ones
  13. SVN Cannot merge into a working copy that has local modifications
  14. linux如何做bond4,linux系统做bond
  15. VSCode 扩展中出现严重漏洞,可导致供应链攻击
  16. 一步步教你轻松学主成分分析PCA降维算法
  17. 互联网轻量级框架SSM-查缺补漏第八天(MyBatis插件plugin使用及原理)
  18. DevExpress WinForm 控件汉化方法 代码(一)
  19. java开源商城 java搭建直播商城 微服务商城 百万千万级商城 分布式商城 VR全景商城 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城 商家入驻商城
  20. 搜索引擎最经典的书籍——《走进搜索引擎》(梁斌 著)百度网盘免费下载

热门文章

  1. 如何用UE4制作假透明冰块材质
  2. 手机html脚本病毒,自己整的按键精灵脚本也能当成病毒……
  3. 社区力量|因为 EMQ,他上了微博热搜
  4. 如何写一封彬彬有礼的英文email给国外学者
  5. luffcc项目-06-使用容联云发送短信、Celery
  6. Typora官网下载的最新版本mac10.13以下版本用不了的解决办法
  7. 长远发展java还是cocos_聊聊 Cocos Creator 3D 的未来
  8. python字典中如何索引_如何索引字典?
  9. 盘点国内29款医疗语音产品,精准把握痛点是关键
  10. Vite给不同环境处理不同的打包命令