专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

ioc是什么意思(IOC的原理及手动实现)

来源:小易整编  作者:小易  发布时间:2020-03-19 07:14
摘要:ioc是什么意思(IOC的原理及手动实现)导语 S pr ing是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。也是几乎所有Java工作者必须要掌握的框架之一,其优秀的设计思想以及其代码实现上的艺术也是我们需要掌握的。 要学习Spring,除了在我们的项目中使用之外...

ioc是什么意思(IOC的原理及手动实现)导语

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的基本原理已经表达出来了,后面我们只需在这个基础上添加新的功能即可。


本文地址:问答解惑频道 https://www.hkm168.com/live/104329.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


问答解惑
小编:小易整编
相关文章相关阅读
  • 祝福老师句子大全,教师节送礼必备(感恩教育恩人)

    祝福老师句子大全,教师节送礼必备(感恩教育恩人)

    祝福老师句子大全,教师节送礼必备(感恩教育恩人)教师节是每年的9月10日,这一天是我们向教育恩人表达感激之情和祝福的日子。在这个特殊的日子里,送上一句祝福老师的话语,表达我们对教育工作者的敬意和感激之情,成为了每位学生们献给老师的最好礼物。...

  • 贺知章名句赏析,诗人风采展示(品味优美诗歌)

    贺知章名句赏析,诗人风采展示(品味优美诗歌)

    贺知章名句赏析,诗人风采展示(品味优美诗歌)贺知章,唐代诗人,被誉为“豪放派”代表之一。他的诗歌生动有力,意境深远,语言通俗易懂,充满浓郁的民族气息。他留下了许多优美的诗句,让人感慨万千,不得不赞叹其诗才与风采。其中,著名的“海内存知己,天...

  • 纸飞机折法,制作简单易学(挑战手工艺术)

    纸飞机折法,制作简单易学(挑战手工艺术)

    纸飞机折法,制作简单易学(挑战手工艺术)纸飞机是一款低成本、简单易学的手工艺品,因其制作过程简单易懂,大家可以尝试在家,不需要太多专业工具。首先准备一张A4大小的白纸,将其折成一半,然后再打开,将两边的边角对齐,再次往中间折叠。在折叠的位置...

  • 中超赛程表,看球购票攻略(跟随绿茵场之旅)

     中超赛程表,看球购票攻略(跟随绿茵场之旅)

    中超赛程表,看球购票攻略(跟随绿茵场之旅)中超联赛一直以来都备受球迷关注,每个赛季都会有无数的球迷前往现场观看比赛。为了让广大球迷更好地安排自己的观赛计划,我们在这里为大家介绍一下中超赛程表和看球购票的攻略。中超赛程表中超联赛一般从3月份开...

  • 春节习俗大全,传统文化策源地(领略浓郁年味)

    春节习俗大全,传统文化策源地(领略浓郁年味)

    春节习俗大全,传统文化策源地(领略浓郁年味)春节是中国最重要的传统节日,也被称作“年节”、“新春节”等,是一个具有重大历史意义和文化内涵的节日。说到春节,就不得不提到具有浓郁地域特色和文化内涵的习俗,这些习俗既体现了中华民族的优秀文化传统,...

  • “水”字旁常用字,快速记忆方法(提高汉字识别能力)

    “水”字旁常用字,快速记忆方法(提高汉字识别能力)

    “水”字旁常用字,快速记忆方法(提高汉字识别能力)汉字是中国文化的重要组成部分,对于中文学习者而言,汉字的认识和记忆是非常重要的。其中“水”字是汉字中的一个旁常用字。在学习这个字时,我们可以采用一些快速记忆方法,提高汉字识别能力。首先,我们...

  • 做梦梦见很多蛇,分析梦境内涵(看懂心理暗示)

    做梦梦见很多蛇,分析梦境内涵(看懂心理暗示)

    做梦梦见很多蛇,分析梦境内涵(看懂心理暗示)做梦时梦见很多蛇是一种比较常见的梦境,对于这种梦境的解释和分析是非常重要的。从心理学的角度来看,这种梦境不仅反映了我们潜意识中的想法和情感,也可以为我们指引未来的行动。首先,梦见很多蛇可能说明我们...

  • 制作铃声详解,打造个性化手机(表现自我风格)

    制作铃声详解,打造个性化手机(表现自我风格)

    制作铃声详解,打造个性化手机(表现自我风格)随着移动设备的普及,手机不仅是通信工具,也成为了一种个性化的表现方式。而铃声则是手机个性化中最直接的表现形式之一。制作一个个性化的铃声,不仅可以让你的手机更具有个性化的特色,同时还可以让你展现出自...

  • 周排行
  • 月排行
  • 年排行

精彩推荐