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

访客4年前关于黑客接单968

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

标签: 原理ioc

相关文章

初中学习计划?初中学霸学习计划表

中三年最完整的学习规划。 从升入初一开始,关于中、高考的战斗已经开始。面对中考和高考这两次重要的考试,细节往往决定着最终的成败,而大起大落的学生最终考试结果往往是"落"。因此,做个完美的规划,注重平...

习近平寄语新时代青年强调 坚定理想信念站稳人民立场 练就过硬本领投

习近平寄语新时代青年强调 坚定理想信念站稳人民立场 练就过硬本领投

新华社北京5月3日电 在五四青年节到来之际,中共中央总书记、国家主席、中央军委主席习近平代表党中央,向全国各族青年致以节日的祝贺和诚挚的问候! 习近平指出,青春由磨砺而出彩,人生因奋斗而升华。面...

油烟机品牌排行榜(家用抽油烟机哪个牌子好)

在我们煮饭时,厨房油烟肯定是一种商品,因此 挑选一个好的油烟机是十分必需的,那麼哪样家庭装吸烟机更强?相信在边肖发布后,你能寻找适合的油烟机。 边肖强烈推荐:邰方油烟机的清理方式美的油烟机的选购方式...

手机定位要下载哪个软件(手机精准定位软件)

  手机定位要下载哪个软件(手机精准定位软件)七夕这一天老公或者另一半出门不带自己又不告诉你去哪里该怎么办呢?七夕节,打电话给自己的另一半不接该怎么办呢?在日常生活中,自己的另一半经常外出半夜才回家又...

阿塞拜疆国防部:军队管理沟通案例已正式入驻纳卡克尔巴贾

  阿塞拜疆军队正式入驻纳卡克尔巴贾尔区 当地时间11月18日,纳卡地区的一个村庄里,准备搬离村庄的民众正在打包行李装车。   根据阿塞拜疆国防部公布的消息,当地时间11月25日凌晨阿塞拜...