精简web框架 理解DI、IOC

前言

话说工欲善其事必先利其器,一个优秀的web框架可以说是程序员的利器,Spring框架应是其中牛角,有了它程序员可以更好的关注业务和功能的实现,编码水平瞬间被提升了一个等级,然而在每天使用框架的时候,你是不是会好奇或者迷惑,为什么它能够运行起来?为什么仅是添加一个注解就能够将一个实例赋值给一个被注解的变量?那些听起来高端的概念(如:IOC、DI、AOP等)是如何实现的呢?

本文我们将通过实现一个简单的Java Web框架来理解框架的工作原理和IOC等概念的实现,暂且叫它fine。

首先给出Java Web框架开发整个流程:

框架流程

具体实现

  1. 创建一个maven项目实现fine框架
    创建mavne项目添加相关依赖,需要的包大致有:servlet、jsp、jstl、log4j、 mysql、json、 等以及一些工具包,如果你不打算使用视图层可以忽略jsp 和jstl的依赖包。

  2. 编写加载配置项的工具类ConfigHelper。加一些需要的配置变量。

  3. 开发类加载器ClassUtil。在程序启动之初加载基础包下所有类。

  4. 编写注解类,比如@Action(接受http请求的方法), @Inject(依赖注入)等。注解的概念在书《Java编程思想》中介绍的很清楚,是一种标记,本框架中的注解就是为了在运行中框架能够让程序知道被注解的类、方法或者变量有哪些。

  5. 实现Bean容器ClassHelper。利用反射机制,将上一步加载的类实例化成对象,并将这些对象放入一个静态的Map<Class<?>,Object>中,此Map就是Bean容器,它记录了类与对象的关系,以后需要单例的对象时就从Bean容器中取出。

  6. 实现依赖注入,也就是IoC(控制反转),框架来控制对象之间的依赖关系,将一个对象赋值给一个加了相应标记(注解)的变量。具体实现过程是将第4步中的Bean容器(Map<Class<?>,Object>)做遍历操作,查看当前类的成员变量是否带有Inject注解,若带有该注解,就从Bean容器中取出对象,赋值给当前成员变量。

  7. 实现Controller层,通过一个类ControllerHelper统计请求路径与方法的对应关系。通过反射获取带有@Action注解的方法,获取@Action注解中的请求表达式(请求路径信息),封装一个请求对象(Request)与处理对象(Handler),将Request与Handler建立映射关系,处理请求。

  8. 实现一个请求转发器,处理所有请求,从HttpServletRequest对象中获取请求路径与参数,将请求路径与ControllerHelper统计的请求路径做对应关系,并将参数传入ControllerHelper中的相应方法。

总结

至此,一个能够处理http请求的框架终于开发完成,其中还有很多不足之处,但是通过此框架能够深入的理解现在工程中使用的优秀框架的工作原理,有利于我们更好的在实际中排查问题,甚至定义一些特定规则优化现有框架。

本文参考书籍

  • 《Java编程思想》
  • 《Spring源码解析》
  • 《架构探险 从零开始写javaweb框架》
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2015-2020 AChampion
  • Powered by Hexo Theme Ayer
  • PV: UV:

开玩笑的~不用打赏