IOC和DI理解

1 篇文章 0 订阅

IOC是什么?

IOC—Inversion of Control, 即”控制反转“,是一种设计思想。在java开发中将你设计的对象交给容器来进行管理控制。
如何理解好IOC呢?理解好IOC的关键是要明确”谁控制谁,控制什么,为何是反转(有反转就应该有正传),那些方面反转了“。在下面分析一下:
谁控制谁,控制什么:传统Java程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IOC是有专门的一个容器来创建这些对象,既由IOC容器来控制对象的创建而不是显式的使用new;谁控制谁?是由IOC容器控制了对象;控制什么?主要控制了外部资源获取和生命周期(不只是对象也包含了文件等)。
为何是反转,哪些方面反转了:有反转就有正转,传统的应用程序是由我们在对象中主动去控制依赖对象的获取,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
用如下两张图说明一下传统应用程序和IOC设计:
下图为传统程序设计,都是主动去创建对象然后组合:
图1
下图为IOC容器设计,在客户端类中不在主动去创建这些对象了:
图2

IOC能做什么?

IOC是一种思想,一个面向对象编程的重要法则,他能指导我们如何设计出松耦合、更优良的程序。简单的来说IOC可以降低耦合度。
传统的应用程序是由我们在类中主动创建依赖对象,从而导致类与类之间高耦合。
IOC把创建和查找依赖对象的控制权交给了容器,由容器进行注入依赖对象,减少了类与类之间的耦合度,使结构代码变得更加灵活。
其实IOC对编程带来的最大的改变不是从代码上,而是从思想上,发生了“主从换位”的变化,应用程序原来是老大,想要获取什么资源都需要主动出击,但是在IOC/DI思想中,应用程序就变得被动了,被动的等待IOC容器来创建并注入他所需要的资源。
IOC很好的体现了面向对象设计法则之一—好莱坞法则:“别找我们,我们找你”;既由IOC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

DI是什么?

DI—Dependency Injection,即“依赖注入”:由容器动态的将某个依赖关系注入到组件中。
依赖注入的目的是为了提升组件重用率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身业务逻辑,而不需要关心具体的资源来自何处,有谁实现。
理解DI的关键:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”。
分析如下:
谁依赖谁:应用程序依赖IOC容器;

  • 为什么需要依赖:应用程序需要IOC容器来提供对象需要的外部资源;
  • 谁注入谁:IOC容器注入应用程序某个对象;
  • 注入了什么:注入某个对象所需要的外部资源(包括对象、资源、常量数据);

IOC和DI的意义?

在平时的Java应用开发中,我们要实现某一个功能或者说是完成某个业务逻辑时至少需要两个或以上的对象来协作完成,在没有使用Spring的时候,每个对象在需要使用他的合作对象或者依赖对象时,自己均要使用像new object() 这样的语法来将合作对象创建出来,这个合作对象是由自己主动创建出来的,创建合作对象的主动权在自己手上,自己需要哪个合作对象,就主动去创建,创建合作对象的主动权和创建时机是由自己把控的,而这样就会使得对象间的耦合度高了,A对象需要使用合作对象B来共同完成一件事,A要使用B,那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起。
而使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题(你是什么时候生的,怎么生出来的我可不关心,能帮我干活就行),A得到Spring给我们的对象B之后,两个人一起协作完成要完成的工作即可。
所以控制反转IOC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IOC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IOC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IOC容器了,通过IOC容器来建立它们之间的关系。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值