一. 写在前头
项目地址:https://github.com/Gintoki-97/webmvc
项目描述:
- IOC&DI 容器的基本实现,可以通过 XML 的方式配置 Bean,容器会自动扫描并处理依赖关系;而控制器层则同时提供了基于 XML 及扫描两种方式。
- 手动对 SpringMVC 进行了实现,流程与 SpringMVC 的基本思想一致。
- 提供了基于 JDBC 操作数据库的便捷工具类,可类比为简化的 JdbcTemplate。
项目目的:代码写得很简单,可以便于理解 Spring IOC 实现的基本思路以及 SpringMVC 的处理流程。
有关 webmvc 如何使用的问题:
- 从 Github 下载源码,确保代码已经保存到本地。
- 进入到 %root%/src/webmvc,查看 pom.xml 中 version 的信息,以目前版本为例,版本号为 2.0.1。
- 在当前目录下使用命令 mvn package,会在当前目录下生成 target 目录,而 target 目录下就包含完整的 webmvc Jar 包。
- 进入到 target 目录后,再运行命令 mvn install:install-file -Dfile=webmvc-2.0.1.jar -DgroupId=cn.gin -DartifactId=webmvc -Dversion=2.0.1 -Dpackaging=jar 可以将这个 Jar 包安装包本地仓库。
- 在代码中像使用其它依赖一样,将对应的 Maven 坐标填入 dependency 中就会从本地仓库引入刚才打包成功的 webmvc 的 Jar 包。
%root% 表示 webmvc 解压后项目的根路径;
%src%表示 %root%/src/webmvc/src/main/java;
二. 核心类描述
- IOC 相关
/**
* ~ 应用上下文
*
* 根据 ApplicationContextConfig 中的各项参数,初始化容器。加载指定
* 的配置文件、初始化所有的 Bean、启动 MVC 组件及注解扫描功能。
**/
cn.gin.webmvc.context.ApplicationContext
/**
* ~ 应用上下文配置映射类
*
* 用于将应用配置文件(默认 beans.xml)映射为 Java 中的类,提供给
* ApplicationContext。上下文对象会根据配置文件做出相应操作。
*
* 比如读取系统中的自定义配置文件、初始化配置文件中的 Bean、处理
* 依赖关系、初始化 MVC 组件等。
**/
cn.gin.webmvc.context.ApplicationContextConfig
- MVC 相关
/**
* ~ Annotation
*
* 功能类似于 SpringMVC 中的 RequestMapping,用于指定控制器或者方
* 法对应的 URL 映射。
**/
cn.gin.webmvc.anno.RequestMapping
/**
* ~ Annotation
*
* 功能类似于 SpringMVC 中的 RequestMethod,指示方法所能支持的
* HTTP method 类型。目前只包含 GET 和 POST,其它方法同理。
**/
cn.gin.webmvc.anno.RequestMethod
/**
* ~ 前端控制器
*
* 功能类似于 SpringMVC 中的 DispatcherServlet,接收到用户请求后,
* 委托 ControllerMapping 查找对应的 Controller。在 Controller 处理完毕
* 后则根据处理结果对客户端进行响应,并同步 RequestMap、
* SessionMap、Cookie 等信息。
**/
cn.gin.webmvc.controller.DispatcherServlet
/**
* ~ 标记接口
*
* 功能类似于 SpringMVC 中的 @Controller 注解,自动扫描组件在扫描
* 指定 package 时会根据此接口来区分是否是控制器,并在检查完毕后将
* 所有控制器移交给 ControllerMapping 进行管理。
**/
cn.gin.webmvc.controller.Controller
/**
* ~ 控制器映射器
*
* 功能类似于 SpringMVC 中的 HandlerMapping,前端控制器根据用户请
* 求创建一个 RequestDefinition,并将此对象交给控制器映射器。
* 映射器可以根据 RequestDefinition 来找到唯一一个与之相匹配的
* ControllerAdaptor,也就相当于找到了对应的处理器。
**/
cn.gin.webmvc.controller.ControllerMapping
cn.gin.webmvc.controller.ControllerMapping.RequestDefinition
/**
* ~ 控制器适配器
*
* 功能类似于 SpringMVC 中的 HandlerAdaptor。
*
* 为什么需要一个适配器去处理请求而不是直接交给处理器去处理,这个
* 问题通过 ControllerAdaptor 的代码可以很显然看出来。
* 我们都知道,类是无法直接提供服务的,最终真正处理请求的肯定是类
* 中的某一个方法,如果直接返回一个 ControllerMapping,那么前端控制
* 器并不知道要执行这个控制器的哪个方法。
*
* 适配器知道要交给哪个类的哪个方法执行,它处于前端控制器和控制器
* 之间,作用确实像一个适配器一样。前端控制器不需要也不能让控制器
* 直接去处理,就让适配器去执行这一操作。这样一来整个流程就顺理成
* 章了。
**/
cn.gin.webmvc.controller.ControllerAdaptor