手把手教你写一个 spring IOC 容器

424 阅读3分钟

摘要: spring 框架的基础核心和起点毫无疑问就是 IOC,IOC 作为 spring 容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了 spring 容器对依赖的全局控制。今天就带大家手写一个 spring IOC 容器。

本文分享自华为云社区《手把手教你写一个springIOC容器》,原文作者:技术火炬手。

spring 框架的基础核心和起点毫无疑问就是 IOC,IOC 作为 spring 容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了 spring 容器对依赖的全局控制。今天就带大家手写一个 spring IOC 容器。

第 0 步(准备工作):

(1)JDK1.8 及 java 环境变量

(2)maven 包及 maven 环境变量

(3)idea

第 1 步(创建项目,引入 tomcat 包)

PS:由于该项目的作用是模拟 spring 的部分功能,所以取名为 spring

(1)创建好的项目内容如下图:

(2)pom 文件的初始状态如下:

第 2 步:搭建主体框架 PS:一个正常的 spring 项目一般分为 controller 和 service 部分,此处暂时忽略数据库链接

(1)其中,TestController 实现功能,返回 name+“Hello World!”,引用 TestService

(2)而 TestService 和 TestServiceImpl 则分别实现功能

第 3 步:创建,并打上标签 PS:我们需要很多标签,如 service,controller,还有 autowired 等

(1)创建各种标签(暂时创建这些标签,后面不够再加)

(2)打上标签

由于 RequestMpping 后面需要跟路径,所以此处需要重写其 value()方法,如下:

第 4 步:进入正题,创建一个 DisPatcherServlet 类,用于实现 IOC 容器功能

(1)DisPatcherServlet 继承 HttpServlet(注意添加依赖),并重写 doGet,doPost 方法

(2)创建一个 doDispatcher 方法,并被 doPost 引用

第 5 步:初始化

(1)暂停实现 doDispatcher,去重写初始化方法 init,初始化共分为五大步骤,如下

注意:顶端要加上属性类(Properties),且要 resource 中加 application.properties,并加上 scanPackage 属性,内容为需扫描的根目录

(2)加载配置文件实现,需要先配置一个 web.xml,路径和内容如下:

路径:

内容:

​剩下的内容,大家应该能看懂的吧

(3)下一步,使用递归,将所有 class 的路径存入一个集合(classPaths)里面

(4)下一步,将打上了 controller 和 service 标签的类放入 ioc 容器中

(5)下一步,注入(通过 Autowired 标签从 IOC 容器中获取实例对象并赋值)

(6)获取所有的 RequestMapping 内容,并写到一个对象集合中

第 6 步:回头实现 doDisPatcher 的步骤

(1)首先,设定 404(class notfound)

(2)后面一半,实现接口功能

PS1:判断 url 方法

PS2:根据 url 获取方法

PS3:获取方法下的所有参数

最后一步:执行 tomcat

so,

(1)你以为以上的内容是对的嘛?

(2)你以为你能得到想要的结果吗?

太天真了!!!

如果你按照我说的方法去运行,恭喜你,得到的结果是 not found!!!

真正的挑战才刚刚开始,

第一,标签类的定义,如下,特别重要的是 Target

还需要补充一个 mapping

第二,TestController 类中,RequestParam 少了 value 属性,如果没有,则无法传值。

第三,那么参数初始化,是不是也有一点问题呢?注意这段代码,传参的名字应该和什么相关?

好了 现在真的可以成功了~~~

看看结果吧。

​完结撒花~~~

点击关注,第一时间了解华为云新鲜技术~