当前位置:
首页
文章
后端
详情

手写spring IOC容器详细的教程过程

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

第0步(准备工作):

(1)JDK1.8及java环境变量
(2)maven包及maven环境变量
(3)idea

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

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

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

2021041211140344

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

2021041211140445

第2步:搭建主体框架

PS:一个正常的spring项目一般分为controller和service部分,此处暂时忽略数据库链接

2021041211140446

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

2021041211140447

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

2021041211140448

第3步:创建,并打上标签

PS:我们需要很多标签,如service,controller,还有autowired等

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

2021041211140449

(2)打上标签

2021041211140450

2021041211140451

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

2021041211140452

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

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

2021041211140453

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

2021041211140454

第5步:初始化

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

2021041211140555

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

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

路径:

2021041211140557

内容:

2021041211140558

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

2021041211140559

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

2021041211140560

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

2021041211140561

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

2021041211140562

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

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

2021041211140563

(1)首先,设定404(class notfound)
(2)后面一半,实现接口功能
PS1:判断url方法
PS2:根据url获取方法
PS3:获取方法下的所有参数

最后一步:执行tomcat

so,

(1)你以为以上的内容是对的嘛?
(2)你以为你能得到想要的结果吗?

太天真了!!!

如果你按照我说的方法去运行,恭喜你,得到的结果是not found!!!真正的挑战才刚刚开始:

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

2021041211140564

还需要补充一个mapping

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

2021041211140666

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

2021041211140667

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

2021041211140668

看看结果吧。

完结撒花~~~

到此这篇关于手写 Spring 框架的 IOC 容器的教程文章就介绍到这了,更多相关 spring IOC 容器的内容,请搜索W3Cschool以前的文章或继续浏览下面的相关文章,也希望大家以后多多支持我们!


免责申明:本站发布的内容(图片、视频和文字)以转载和分享为主,文章观点不代表本站立场,如涉及侵权请联系站长邮箱:xbc-online@qq.com进行反馈,一经查实,将立刻删除涉嫌侵权内容。

同类热门文章

深入了解C++中的new操作符:使用具体实例学习

C++中的new操作符是动态分配内存的主要手段之一。在程序运行时,我们可能需要动态地创建和销毁对象,而new就是为此提供了便利。但是,使用new也常常会引发一些问题,如内存泄漏、空指针等等。因此,本文将通过具体的示例,深入介绍C++中的new操作符,帮助读者更好地掌握其使用。


深入了解C++中的new操作符:使用具体实例学习

怎么用Java反射获取包下所有类? 详细代码实例操作

Java的反射机制就是在运行状态下,对于任何一个类,它能知道这个类的所有属性和方法;对于任何一个对象,都能调用这个对象的任意一个方法。本篇文章将通过具体的代码示例,展示如何通过Java反射来获取包下的所有类。


怎么用Java反射获取包下所有类? 详细代码实例操作

了解Java中的volati关键字的作用 以及具体使用方法

本篇文章将和大家分享一下Java当中的volatile关键字,下面将为各位小伙伴讲述volatile关键字的作用以及它的具体使用方法。


了解Java中的volati关键字的作用 以及具体使用方法

Java Map 所有的值转为String类型

可以使用 Java 8 中的 Map.replaceAll() 方法将所有的值转为 String 类型: 上面的代码会将 map 中所有的值都转为 String 类型。 HashMap 是 Java

Java Map 所有的值转为String类型

员工线上学习考试系统

有点播,直播,在线支付,三级分销等功能,可以对学员学习情况的监督监控,有源码,可二次开发。支持外网和局域网私有化部署,经过测试源码完整可用!1、视频点播:视频播放,图文资料,课件下载,章节试学,限时免

员工线上学习考试系统