A Simple Implementation of Spring MVC
基于Spring IOC 和 原生Servlet 完成的一个简单的 Spring MVC。
包含简单处理流程和注解处理流程。
如果想了解 Spring MVC 基本源码和该项目源码具体分析可以参考我的以下两篇文章。
├── adapter 适配器实现
├── annotation 自定义注解实现
├── handler 处理器实现,包含Controller测试
├── ioc IOC容器实现,基于Spring本身
├── model ModelAndView
├── servlet 分发器
对于这个自制的 Spring MVC 框架的初始化流程来说,主要可以分为以下几个步骤。
- 读取
web.xml文件,进行DispatcherServlet的初始化。 - 对于
DispatcherServlet的初始化主要分为两步——BeanFactory和handlerMappings、handlerAdapters的初始化。 - 对于
BeanFactory的初始化,主要是获取springmvc.xml配置文件的路径,然后通过spring进行容器初始化。需要注意的在IOC容器进行初始化的时候需要进行RequestMappingHandlerMapping类的初始化,而这个类的初始化方法会依赖于整个IOC容器(也就是说它会在初始化的时候就去容器中读取数据,但是这个时候IOC容器还未初始化完毕,所以就会抛出空指针异常),所以我们需要设置这个类进行懒加载初始化,也就是lazy-init= true。 - 当
IOC容器初始化完毕之后,DispatcherServlet会从容器中获取所有的HandlerMapping和HandlerAdapter然后放入自己对应的list中。
对于请求的流程来说,主要核心就是通过 request 在 handlerMapping 中寻找对应的处理器,并封装成处理器适配器最终得到处理。
- 进入
doDipatch方法然后通过request寻找对应的处理器。其中这里使用过遍历handlerMappings来获取对应的处理器的。 - 将处理器封装为处理器适配器
handlerAdapter,然后通过处理器适配器的统一方法进行处理。请注意这里最终还是调用的原处理器的处理方法,而做适配器的原因是因为对于handler来说,可以来自不同框架(本身我们也是定义的Object),所以为了良好的扩展性,框架中使用了适配器模式。 - 等到处理完成的时候,我们可以根据结果将内容写入
response中。
您可以在直接拉取项目并运行,请确保本机在 8080 端口没有运行其余项目,当然你也可以更改端口,因为本项目是运行在 Tomcat 提供的 maven 插件中的,所以需要您在 pom.xml 文件中进行相应的修改。
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>还需要注意的是,请在运行之前,通过
tomcat7:run命令进行配置,否则无法运行成功。
推荐您输入 127.0.0.1:8080/helloWorld 在浏览器中进行访问,并且在 HelloWorldHandler 中打下相应的断点调试。
如果需要自定义的话,您需要将自己实现的类写入 springmvc.xml 配置文件中。
如果需要查看整个项目的流程,推荐您在 DispatcherServlet 中的初始化方法中进行断点调试。

