您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

理解Spring:IOC的原理及手动实现

时间:2019-12-30 14:02:17  来源:  作者:

作者:宁愿

juejin.im/post/5c11b1e06fb9a04a0d56b787

导语

Spring是一个分层的JAVASE/EE full-stack(一站式) 轻量级开源框架。也是几乎所有Java工作者必须要掌握的框架之一,其优秀的设计思想以及其代码实现上的艺术也是我们需要掌握的。

要学习Spring,除了在我们的项目中使用之外,也需要对它的源码进行研读,但是Spring的实现涵盖的知识很多,在加上其中的类的数量也是非常的多,在我们阅读源码时可能会在几十个类之间穿插阅读,很有可能一不小心就导致思维混乱。

有鉴于此,我这里先对Spring中的几个重要的模块进行一个手动的简易实现,一是熟悉这些模块的原理,同时也是仿造Spring中的结构来对后面阅读源码打下基础。

IOC(Inversion of Control)

Inversion of Control即控制反转,其意思是将我们之前由客户端代码来创建的对象交由IOC容器来进行控制,对象的创建,初始化以及后面的管理都由IOC完成。

IOC的好处

解耦:IOC的出现解决了类与类之间的耦合,我们在Web开发的Servlet时代,如果一个Servlet需要依赖另一个类的某些实现,那么我们需要在当前类对依赖的类进行创建和初始化,如果其他类也依赖了这个类,那也需要进行创建和初始化,而交给了IOC来管理的话,那么在需要的时候只需向IOC进行申请,而不需要重复的创建和初始化。当然,IOC也允许每次都重新创建一个新的对象。

方便与AOP进行配合:AOP也是一个使用十分频繁的功能,通过IOC可以十分方便的与AOP进行配合。

IOC中设计的设计模式

工厂模式。IOC容器来负责创建管理类实例对象,在需要时向IOC进行申请,从IOC中获取。所以IOC容器也称为bean工厂。

工厂模式是一种比较简单易懂的设计模式,这里就不在介绍了,如果有需要的可以看看工厂模式。

IOC的手动实现

Bean定义

IOC的主要的功能便是对Bean进行管理,包括创建、初始化、管理以及销毁的工作。首先我们面对的问题就是我们怎么让IOC能够创建一个Bean?为了创建Bean我们需要提供一些什么?

如何创建Bean

在不手动通过new关键字创建的情况下创建类实例的对象方法有两种:

  • 反射:通过反射的方法可以创建类的实例:clazz.getClass().newInstance();。
  • 工厂模式:工厂模式可以让我们在不接触实例类的情况下创建出实例。
publicclassPersonFactory{publicPersongetPerson(){returnnewPerson();}}

为了创建Bean我们需要提供什么

通过分析上面的两种方法可以轻松得出答案。

对于反射的方式我们仅需提供实例的Class对象。

对于工厂方法我们需要提供的就是创建该类的工厂名(factoryName)和方法名(methodName);

除了创建bean还需要做些什么

IOC容器是对bean的整个生命周期进行管理,除了创建之外还需要对bean进行初始化,以及不需要时对bean进行销毁的工作(如释放资源等)。所以我们还需要提供初始化和销毁等操作。

到这里创建bean需要的基本分析完了,看类图:

理解Spring:IOC的原理及手动实现

 

Bean工厂

Bean的定义解决了,但是这个bean定义以及创建好的Bean实例放在哪里呢,我们需要一个统一的地方来存放这些东西以方便我们要用的时候方便取。

我们定义一个Bean工厂来存放bean,在需要的时候从bean工厂中取即可,bean工厂对外提供的也仅仅是一个获取bean的方法即可,由于bean的类型不定,所以返回值定位Object。

理解Spring:IOC的原理及手动实现

 

注册Bean定义

到了现在我们有了创建bean的Bean定义,有了存放和管理bean的Bean工厂,现在需要考虑的是怎么来联系这两个类,我们还需要另外一个接口,接口的功能是让我们能注册和获取bean定义,这里我们通过beanName来区分不同的bean。

理解Spring:IOC的原理及手动实现

 

代码实现

到这里我们实现一个简易的IOC容器的需要的东西基本准备完成了,看下基本类图:

理解Spring:IOC的原理及手动实现

 

基本代码实现:

DefaultBeanDefinition:

publicclassDefaultBeanDefinitionimplementsBeanDefinition{privateClass<?>clazz;privateStringbeanFactoryName;privateStringcreateBeanMethodName;privateStringstaticCreateBeanMethodName;privateStringbeanInitMethodName;privateStringbeanDestoryMethodName;privatebooleanisSingleton;//setterpublicvoidsetSingleton(booleansingleton){isSingleton=singleton;}@OverridepublicClass<?>getBeanClass(){returnthis.clazz;}@OverridepublicStringgetBeanFactory(){returnthis.beanFactoryName;}@OverridepublicStringgetCreateBeanMethod(){returnthis.createBeanMethodName;}@OverridepublicStringgetStaticCreateBeanMethod(){returnthis.staticCreateBeanMethodName;}@OverridepublicStringgetBeanInitMethodName(){returnthis.beanInitMethodName;}@OverridepublicStringgetBeanDestoryMethodName(){returnthis.beanDestoryMethodName;}@OverridepublicStringgetScope(){returnthis.isSingleton?BeanDefinition.SINGLETION:BeanDefinition.PROTOTYPE;}@OverridepublicbooleanisSingleton(){returnthis.isSingleton;}@OverridepublicbooleanisPrototype(){return!this.isSingleton;}}

DefaultBeanFactory:

 

理解Spring:IOC的原理及手动实现

 

 

理解Spring:IOC的原理及手动实现

 

 

理解Spring:IOC的原理及手动实现

 

 

理解Spring:IOC的原理及手动实现

 

 

理解Spring:IOC的原理及手动实现

 

简单测试一下:实例bean:

publicclassUser{privateStringname;privateintage;//gettersetterpublicvoidinit(){System.out.println("init...");}publicvoiddestory(){System.out.println("destory...");}}

工厂类:

publicclassTestFactory{publicObjectcreateMethod(){returnnewUser();}publicstaticObjectstaticCreateMethod(){returnnewUser();}}

测试类:

 

理解Spring:IOC的原理及手动实现

 

小结

一个简易的容器就这样实现了,当然我们这里只是具备了基本的功能,实际上还差的远,比如带参数的bean的实例化等功能。但是IOC的基本原理已经表达出来了,后面我们只需在这个基础上添加新的功能即可。



Tags:Spring IOC   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。也是几乎所有Java工作者必须要掌握的框架之一,其优秀的设计思想以及其代码实现上的艺术也是我们需要掌握的。...【详细内容】
2019-12-30  Tags: Spring IOC  点击:(66)  评论:(0)  加入收藏
▌简易百科推荐
一、前因闲来没事,想着升级下树莓派中的应用,没曾想,全是最新的,害我以为被黑客眷顾,帮我升级了。多方查证,才知道,是上次搭建的photoprism搞的鬼,不过也不全是它的锅,只是它的yml文...【详细内容】
2021-12-28  闲余悟道    Tags:Docker   点击:(2)  评论:(0)  加入收藏
一、为什么要搭建主从架构呢1.数据安全,可以进行数据的备份。2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据...【详细内容】
2021-12-15  实战Java    Tags:Docker   点击:(12)  评论:(0)  加入收藏
在网页中渲染公式一直是泛学术工具绕不开的一个功能,最近更新产品功能,正巧遇到了这个需求,于是使用容器方式简单实现了一个相对靠谱的公式渲染服务。分享出来,希望能够帮到有类...【详细内容】
2021-12-01  编程菌zfn    Tags:Docker   点击:(11)  评论:(0)  加入收藏
1.1 docker命令直接部署1.1.1 拉取镜像docker pull wurstmeister/zookeeperdocker pull wurstmeister/kafka1.1.2 启动zookeeper容器docker run -d --name myzookeeper -p 2...【详细内容】
2021-11-15  无    Tags:docker   点击:(48)  评论:(0)  加入收藏
01 前言 顺着docker的发展,很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以...【详细内容】
2021-10-29  小码哥聊软件测试    Tags:Docker   点击:(42)  评论:(0)  加入收藏
因为你懂得的原因,下载docker镜像速度非常喜感,故收集几个国内常用的docker镜像。Docker中国区官方镜像地址:https://registry.docker-cn.com网易163的镜像http://hub-mirror.c...【详细内容】
2021-10-28  抓蛙程序猿    Tags:docker   点击:(48)  评论:(0)  加入收藏
环境:Spring5.3.10通常,应用程序开发人员不需要对ApplicationContext实现类进行子类化。相反,SpringIOC容器可以通过插入特殊集成接口的实现来扩展。使用BeanPostProcessor自定...【详细内容】
2021-10-26  Java网络研发架构师    Tags:Spring   点击:(34)  评论:(0)  加入收藏
我们在很多场景下都需要做笔记,来对抗遗忘,一份好的笔记不仅能在需要的时候供我们查阅,也能帮助我们归纳整理知识提高做事效率。 目前市面上有很多云笔记软件,体验上各有不同,但...【详细内容】
2021-10-11  运维贼船    Tags:docker   点击:(62)  评论:(0)  加入收藏
1. Nacos官网Nacos Docker 快速开始2. Clone 项目git clone https://github.com/nacos-group/nacos-docker.git3. cd 到nacos-docker 路径下 直接启动即可cd nacos-dockerdo...【详细内容】
2021-09-16  程序狗爱化妆    Tags:Nacos   点击:(109)  评论:(0)  加入收藏
今天不做保姆级教程,分享奶爸常用、好用的Docker应用。有了这些Docker,Nas的可玩性会大幅提高,有时候奶爸也在想,刨去官方套件不考虑的话,Nas真的是差不多。如果小伙伴们有需要,后...【详细内容】
2021-09-03  晋升奶爸的垃圾佬    Tags:Docker   点击:(168)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条