手把手教你写一个spring IOC容器的方法

本文分享自华为云社区《手把手教你写一个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容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解析Java的Spring框架的BeanPostProcessor发布处理器

    BeanPostProcessor 的接口定义,可以实现提供自己的实例化逻辑,依赖解析逻辑等,也可以以后在Spring容器实例化完毕,配置和初始化一个bean通过插入一个或多个的BeanPostProcessor实现一些自定义逻辑回调方法实现. 可以配置多个的BeanPostProcessor接口,控制这些的BeanPostProcessor接口,通过设置属性顺序执行顺序提供的BeanPostProcessor实现了Ordered接口. BeanPostProcessor可以对bean(或对象)

  • 一个简单的Spring容器初始化流程详解

    前言 首先我们初始化一个最简单的容器,用这个容器研究初始化的流程. 下面就是一个再简单不过的IoC容器了,该容器包含了一个名为beanA的bean,我们初始化容器后,取出该Bean,并调用方法. public class BeanA { private String testStr = "Test"; public BeanA(){ System.out.println("Running A"); } public void sayHello(){ System.o

  • 详解使用Spring的BeanPostProcessor优雅的实现工厂模式

    最近学习Spring的源码,发现一个利器BeanPostProcessor.这个后置处理器可以在bean初始化前后对bean进行操作.我们可以在初始化的时候对自己想要的bean进行缓存,进而实现自己需要处理的逻辑. 背景 当我们需要根据类型调用接口不同实现的时候,我们可以使用工厂模式实现.下面说下博主遇到过的两次需要使用工厂的场景. 场景一: 当有一个模块,我们需要根据数据库的类型实现不同的的sql.我们此时需要定义一个接口然后每一种数据库实现不同的sql.在调用时根据当前的数据库类型调用对应的

  • 详解SpringIOC容器相关知识

    一.前言 IOC控制反转,不是一种技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交给Spring框架来管理. 区别: 没有IOC的思路:若要使用某个对象,就必须自己负责去写对象的创建 IOC的思路:若要使用某个对象,只需要从Spring容器中获取需要使用的对象,不关心对象的创建过程,也就是把创建对象的控制权交给了Spring框架. 好莱坞法则:Don't call me, I 'll call you 举例说明: 做菜,做蒜薹炒猪肉 你有两种做法: 第一种,自己养猪,然后种蒜薹

  • SpringBoot+Docker+IDEA实现一键构建+推送、运行、同镜像多容器启动

    场景: 由于公司项目需要,需要使用部署微服务项目,而之前都是使用tomcat部署,操作十分繁琐.最近正好在学习Docker,利用Docker容器做部署尝试 需求: 使用Docker部署服务 支持idea插件,一键操作构建.推送镜像.运行 单个镜像需根据不同端口部署多个容器 日志持久化 必要软件 服务器(我的版本为CentOS:7.9) Docker(需要开通远程访问,正式环境请使用证书加密,我这里测试用无加密) Harbor 镜像仓库(可选) 开发端 Docker Desktop (支持本地运行

  • 浅谈BeanPostProcessor加载次序及其对Bean造成的影响分析

    前言 BeanPostProcessor是一个工厂钩子,允许Spring框架在新创建Bean实例时对其进行定制化修改.例如:通过检查其标注的接口或者使用代理对其进行包裹.应用上下文会从Bean定义中自动检测出BeanPostProcessor并将它们应用到随后创建的任何Bean上. 普通Bean对象的工厂允许在程序中注册post-processors,应用到随后在本工厂中创建的所有Bean上.典型的场景如:post-processors使用postProcessBeforeInitializat

  • Spring-IOC容器中的常用注解与使用方法详解

    Spring是什么? Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题.它是一个分层的JavaSE/JavaEE full-stack(一站式)轻量级开源框架,为开发Java应用程序提供全面的基础架构支持.Spring负责基础架构,因此Java开发者可以专注于应用程序的开发. 体系结构 核心容器(Core Container):Spring的核心容器是其他模块建立的基础,有Spring-core.Spring

  • Spring容器的创建过程之如何注册BeanPostProcessor详解

    注册BeanPostProcessor refresh()调用registerBeanPostProcessors(beanFactory)方法,注册Bean的后置处理器,后置处理器是用来拦截bean创建过程的. 不同接口类型的BeanPostProcessor,即继承了BeanPostProcessor接口的子接口,在Bean创建前后的执行时机是不一样的 BeanPostProcessor DestructionAwareBeanPostProcessor InstantiationAware

  • Spring BeanPostProcessor接口使用详解

    Spring中提供了很多PostProcessor供开发者进行拓展,例如:BeanPostProcessor.BeanFactoryPostProcessor.BeanValidationPostProcessor等一系列后处理器.他们的使用方式大多类似,了解其中一个并掌握他的使用方式,其他的可以触类旁通. 这里以BeanPostProcessor为例展示其使用方式. BeanPostProcessor接口提供了两个供开发者自定义的方法:postProcessBeforeInitializati

  • Spring中的后置处理器BeanPostProcessor详解

    BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcessor接口实现类,然后注册到Spring IoC容器中. package com.test.spring; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.B

随机推荐