前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[适合初中级Java程序员修炼手册从0搭建整个Web项目](二)

[适合初中级Java程序员修炼手册从0搭建整个Web项目](二)

作者头像
用户9927510
发布2022-07-29 08:50:27
2380
发布2022-07-29 08:50:27
举报
文章被收录于专栏:六脉神剑的程序人生

前言

文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206 种一棵树最好的时间是十年前,其次是现在

six-finger-web

一个Web后端框架的轮子从处理Http请求【基于Netty的请求级Web服务器】 到mvc【接口封装转发)】,再到ioc【依赖注入】,aop【切面】,再到 rpc【远程过程调用】最后到orm【数据库操作】全部自己撸一个(简易)的轮子。

github

为啥要写这个轮子

其实是这样的,小六六自己平时呢?有时候喜欢看看人家的源码比如Spring,但是小六六的水平可能不怎么样,每次看都看得晕头转向,然后就感觉里面的细节太难了,然后我就只能观其总体的思想,然后我就想我如果可以根据各位前辈的一些思考,自己撸一个简单的轮子出来,那我后面去理解作者的思想是不是简单点呢?于是呢 six-finger-web就面世了,它其实就是我的一个学习过程,然后我把它开源出来,希望能帮助那些对于学习源码有困难的同学。还有就是可以锻炼一下自己的编码能力,因为平时我们总是crud用的Java api都是那些,久而久之,很多框架类的api我们根本就不熟练了,所以借此机会,锻炼一下。

特点

  • 内置由 Netty 编写 HTTP 服务器,无需额外依赖 Tomcat 之类的 web 服务(刚好小六六把Netty系列写完,顺便用下)
  • 代码简单易懂(小六六自己写不出框架大佬那种高类聚,低耦合的代码),能力稍微强一点看代码就能懂,弱点的也没关系,小六六有配套的从0搭建教程。
  • 支持MVC相关的注解确保和SpringMVC的用法类似
  • 支持Spring IOC 和Aop相关功能
  • 支持类似于Mybatis相关功能
  • 支持类似于Dubbo的rpc相关功能
  • 对于数据返回,只支持Json格式

絮叨

此教程只适合初中级水平,因为作者本身水平不高,不喜勿喷,今天是文章的第二篇,实现一个简单的SpringMVC,参考的是Guide哥的jsoncat。好了,下面我给大家来一一走一遍搭建流程

  • 适合初中级Java程序员修炼手册从0搭建整个Web项目(一)

这边建议一边下载源码,一边来看,如果觉得有问题的话

总结的包结构

首先我们来看看写完了MVC之后的包结构,以至于大家心里有数

pom的修改

首先第一步,我先把pom文件新增的地方给大家看看

引入他们一个是反射,因为写轮子,反射肯定用的多,还有一个就是json转换工具

具体MVC的实现

这边我先把整体的思想给大家捋捋,这个只是一个简单的实现,还有很多的细节没有完成

首先,我们看看我们写业务是个怎么样的样子,如下图

好,这个就是我们最终要做到的效果,对吧,那我们浏览器请求的时候长什么样呢?

它长这样,那其实久很清晰了,SpringMVC要实现的就是不同请求走不同的方法嘛,这就是核心思想嘛。总的来说其实就三个部分

  • 一个是原有的server的改造
  • 一个是springmvc相关容器组件的初始化
  • 一个是http请求的请求流程处理

下面,我一一来讲解

改造Netty服务器的请求部分

这边我解题然后把找类 方法的流程给大家,大家自己去看源码

HttpRequestHandler->channelRead0

其实服务器这边需要改造的地方也不多,就是通过请求,来找到不同的处理器,然后再去处理我们的业务,然后根据业务的返回值,然后我们再去封装一些成功或者失败,然后这边来看看server包下面的几个类,具体的代码,大家就自己去看了,每个类基本上有注释

springmvc相关组件的初始化

首先我们再来看看我们的启动类这边, 类 ApplicationServer

然后我们就可以往下跟代码了,其实大家看源码也是这样,但是源码的话细节毕竟多,所以难懂点

类 DispatcherMethodMapper->loadRoutes

这个类的东西还比较多,基本上很多地方我写了注释,如果不懂的可以私下请教,然后我们大致来分析一下吧!

  • 第一个肯定是加载包的扫描路径,因为我这个是基于注解的,我就在配置文件中配置扫描路径
  • 之后就是遍历里面的.class文件,然后找到类上面的注解,如果有RestController 说明他这个类是用来处理请求的,然后遍历类中的方法,然后去一个个分析 PostMapping RequestMapping GetMapping 反正也就是if else 然后把这些方法,把请求的url封装到一个springmvc的容器中,等请求来的时候,就去容器中匹配,然后找到对应的方法,再填充对应的参数,就可以执行方法了,具体的呢?建议大家跟着源码来看哈

之后便是我们的主流程了,我们来看看主题流程怎么走的

还是在服务端那个类那跟起 HttpRequestHandler->channelRead0

我们来看这个方法中的

RequestHandlerFactory->create

其实就是根据不同的请求方式,找到对应的处理类

然后我们接下去看 HttpRequestHandler->channelRead0

然后大家看,这个方法,才是我们的重头戏,也就是我们处理的核心了,我们往下跟 RequestHandler 发现是一个接口

假设我们是Get请求找到他的实现类

GetRequestHandler->handle 这个就是我们真正要看的逻辑所在了,我们往下看

封装请求参数和路径参数

DispatcherMethodMapper->getMethodDetail

MethodDetail->build

这个就是核心填充的方法了,当填充完成之后我们会获得一个对象,这个对象就比较厉害了,他包含,当前要执行的方法 请求参数等,如下图 GetRequestHandler->handle

接着往下

我们来看下,里面的核心方法 ParameterResolver->resolve

根据不同的方式去填充,然后填充完成之后呢

通过反射去拿到当前要执行的对象,然后再通过反射去执行对应的方法,至此mvc的所有流程走完了

我们看看请求的结果

要执行的RestController

请求 http://localhost:8081/user/小六六写MVC

结尾

好了,我们把MVC的小小流程写完了,代码也上传了,希望大家好好学习,一起加油,后面就要撸ioc 和aop了。大家记得把代码拿下来跟,然后打个断点跑跑,代码不多十多个类而已,每个类平均也就100行左右。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 六脉神剑的程序人生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • six-finger-web
    • 为啥要写这个轮子
      • 特点
        • 絮叨
          • 总结的包结构
            • pom的修改
            • 具体MVC的实现
            • 改造Netty服务器的请求部分
            • springmvc相关组件的初始化
            • 之后便是我们的主流程了,我们来看看主题流程怎么走的
          • 我们看看请求的结果
            • 结尾
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档