此文很快能够理解SpringMvc的设计思想,代码精简了许多,保留了最核心的方法,仅供大家参考学习实现思路。
项目结构图如下图所示:

首先从第一个目录看起(annotation):
里面都是自定义注解,并且从命名可以看出与SpringMvc的注解保持一致,具有相同的功能。

上面几个注解的意思我就不过多说明了,相信大家都明白,其他几个注解与这个写法很相似,不同就是被标注的地方不同,比如@Service只能被标注在类上面一样。


Service层,定义了两个方法,将接收到的参数拼接好再返回回去,并且实现类用了自定义的注解标注,最后将会注册。
前面的准备工作做好,最后激动人心的时刻来了,自定义Servlet,SpringMvc底层也是封装了Servlet,只不过我们封装的很简单,不过麻雀虽小五脏俱全,一系列的方法我们还是应有尽有。
一、自定义一个Servlet类,并且继承HttpServlet类,并且重写doGet,doPost,init方法。


差点忘了,贴上pom的图,只需要导入servlet的实现即可。
二、将刚刚定义好的Servlet定义到Web.xml中

三、在inte方法中进行一些初始化操作
编写第一个方法,扫描包下所有文件,并且加入到List中

编写注册Controller和Service的方法,将实例化出来的Controller和Service添加到Map中

编写自动注入方法,自动注入bean

至于为什么beans.get(key)可以直接获取到对象,在上面可以看到Service的实现类上,注解的value是实现类的小写,在doInstance方法中注入的时候,key就是取的注解的value,所以这里可以直接拿到
编写映射mapping的方法

最终将mapping存入map中,通过请求的url可以直接获取到请求的方法

因为从Request中取出的参数都是String,如果接口中有的参数不是String的话,就会出现类型转换错误,所以写了下面这个方法来转换类型

不知道返回值,就用T代替了,typeConversion是一个很简单的实现类,实现了转换的实现
整个初始化过程就如下所示:

调用如下:


调用如下:

整体思路就是这样了,也比较简单,大概总结一下
一、扫描所有文件
二、注册所有Controller和Service
三、自动注入bean
四、将mapping与方法一一对应并且注册到Map中
五、编写调用细节
目前我只实现了RequestParam,还有一个PathVariable没有实现,稍微有点麻烦,以后有时间实现了会将代码更新到github上。
如果有哪里不对的地方,也麻烦指认出来,大家一起学习
网友评论