摘要:spring框架的基础核心和起点毫无疑问就是IOC,IOC作为spring容器提供的核心技术,成功完成了依赖的反转:从主类的对依赖的主动管理反转为了spring容器对依赖的全局控制。今天就带大家手写一个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)创建好的项目内容如下图:

(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属性,如果没有,则无法传值。

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

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

看看结果吧。

完结撒花~~~

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

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

手把手教你写一个spring IOC容器的更多相关文章

  1. 只有20行Javascript代码!手把手教你写一个页面模板引擎

    http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...

  2. 用Rider写一个有IOC容器Autofac的.net core的程序

    一:Autofac是一个和Java里的Spring IOC容器一样的东西,不过它确实没有Spring里的那么方便,主要是在于它没有提供足够的Api和扫描方式等等,不过优点是它比Spring要快很多,而 ...

  3. 让我手把手教你写一个强大、方便使用的 IOC 容器

    一.介绍 1.介绍 最近无聊,也没什么事做,没事做总是要给自己找点事情做吧,毕竟人的生活在与折腾.于是,决定自己手动写一个 IOC 的框架.我们知道在 NetCore 的版本里面已经内置了 IOC 容 ...

  4. 手把手教你写一个SpringMVC框架

    一.介绍 在日常的 web 开发中,熟悉 java 的同学一定知道,Spring MVC 可以说是目前最流行的框架,之所以如此的流行,原因很简单:编程简洁.上手简单! 我记得刚开始入行的时候,最先接触 ...

  5. 自定义模拟一个Spring IOC容器

    一.模拟一个IOC容器: 介绍:现在,我们准备使用一个java project来模拟一个spring的IOC容器创建对象的方法,也就是不使用spring的jar自动帮助我们创建对象,而是通过自己手动书 ...

  6. 手把手教你写一个java的orm(一)

    写之前的说明 其实吧. 这个东西已经写好了,地址在:https://github.com/hjx601496320/JdbcPlus 这系列文章算是我写的过程的总结吧.(恩系列,说明我可能会写好久,╮ ...

  7. 手把手教你写一个java的orm(五)

    生成sql:where 上一篇里我们实现了生成insert的sql,下面要开始实现update,delete,select的sql语句了.但是这些语句有一个比较麻烦的地方是:它们一般后面都会有wher ...

  8. 手把手教你写一个RPC

    1.1 RPC 是什么 定义:RPC(Remote Procedure Call Protocol)--远程过程调用协议 ,RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数 ...

  9. 手把手教你调试SpringBoot启动 IoC容器初始化源码,spring如何解决循环依赖

    授人以鱼不如授人以渔,首先声明这篇文章并没有过多的总结和结论,主要内容是教大家如何一步一步自己手动debug调试源码,然后总结spring如何解决的循环依赖,最后,操作很简单,有手就行. 本次调试 是 ...

  10. 手把手教你写一个RN小程序!

    时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现 ...

随机推荐

  1. 一个基于Vue模型的表单生成器

    哈喽,我是老鱼,一名致力于在技术道路上的终身学习者.实践者.分享者! Vuetify Form Base是一个基于模型的表单生成器,目的是提供一个工具,以便以较少的努力从任何模型数据生成可编辑的表单, ...

  2. CSS z-index属性层重叠顺序

    作者:WangMin 格言:努力做好自己喜欢的每一件事 对于所有定位,最后都不免遇到两个元素试图放在同一位置上的情况.显然,其中一个必须遮住另一个.但是如何控制哪个元素放在上层,这就出现了z-inde ...

  3. Go类型嵌入介绍和使用类型嵌入模拟实现“继承”

    Go类型嵌入介绍和使用类型嵌入模拟实现"继承" 目录 Go类型嵌入介绍和使用类型嵌入模拟实现"继承" 一.独立的自定义类型 二.继承 三.类型嵌入 3.1 什么 ...

  4. 混合应用与Hybrid App开发上架流程透析

    Hybrid App(混合 App)已经成为大家接触最为广泛的 App 形式,不管是我们用到的微信.支付宝还是淘宝.京东等大大小小的应用都非常热衷于Hybrid App 带来的研发效率提升和灵活性. ...

  5. Vivado生成bitstream时报错[Opt 31-67] Problem: A LUT3 cell in the design is missing a connection on input pin I1, which is used by the LUT equation

    这个原因主要是因为有一个引脚没有用到,解决方法. 1.打开Schematic. 2.根据提示的模块去找,比如说我的报错. [Opt 31-67] Problem: A LUT3 cell in the ...

  6. 抽象工厂(Abstract Factory)

    模式定义 提供一个接口, 让该接口负责创建一系列'相关或者相互依赖的对象' , 无需指定他们具体的类 要点总结 如果没有应对'多系列对象构建'的需求变化 ,则没有必要使用Abstract Factor ...

  7. 深入了解Rabbit加密技术:原理、实现与应用

    一.引言 在信息时代,数据安全愈发受到重视,加密技术作为保障信息安全的核心手段,得到了广泛的研究与应用.Rabbit加密技术作为一种新型加密方法,具有较高的安全性和便捷性.本文将对Rabbit加密技术 ...

  8. Linux机器自建账号并赋予sudo权限,同时修改远程端口

    默认使用root账号来操作Linux有一定风险,因此需要自建账号并赋予sudo权限,方便使用 登录为root用户后,创建账号 adduser <username> Ubuntu系统会同时要 ...

  9. 【UniApp】-uni-app-内置组件

    前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-全局数据和局部数据 那么了解完了uni-app-全局数据和局部数据之后,这篇文章来给大家介绍一下 UniApp 中内置组件 首先不管三 ...

  10. jdk9模块化

    JDK 9是Java开发语言的一个重大版本.其中最令人兴奋的新特性之一是模块化系统.模块化系统提出了一种新的代码组织方式,它可以帮助开发人员更好地组织和管理代码,从而使Java应用程序更加可维护.可扩 ...