关闭

控制反转

标签: 面向对象编程设计模式
480人阅读 评论(0) 收藏 举报

控制反转[编辑]

维基百科,自由的百科全书

控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

起源[编辑]

早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了,因为大多数应用程序都是由两个或是更多的类通过彼此的合作来实现业务逻辑,这使得每个对象都需要获取与其合作的对象(也就是它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么这将导致代码高度耦合并且难以维护和调试。

技术描述[编辑]

Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的new一个B的对象。

采用依赖注入技术之后,A的代码只需要定义一个私有的B对象,不需要直接new来获得这个对象,而是通过相关的容器控制程序来将B对象在外部new出来并注入到A类里的引用中。而具体获取的方法、对象被获取时的状态由配置文件(如XML)来指定。

实现方法[编辑]

实现控制反转主要有两种方式:依赖注入和依赖查找。两者的区别在于,前者是被动的接收对象,在类A的实例创建过程中即创建了依赖的B对象,通过类型或名称来判断将不同的对象注入到不同的属性中,而后者是主动索取响应名称的对象,获得依赖对象的时间也可以在代码中自由控制。

依赖注入[编辑]

依赖注入有如下实现方式:

  • 基于接口。实现特定接口以供外部容器注入所依赖类型的对象。
  • 基于 set 方法。实现特定属性的public set方法,来让外部容器调用传入所依赖类型的对象。
  • 基于构造函数。实现特定参数的构造函数,在新建对象时传入所依赖类型的对象。
  • 基于注解。基于Java的注解功能,在私有变量前加“@Autowired”等注解,不需要显式的定义以上三种代码,便可以让外部容器传入对应的对象。该方案相当于定义了public的set方法,但是因为没有真正的set方法,从而不会为了实现依赖注入导致暴露了不该暴露的接口(因为set方法只想让容器访问来注入而并不希望其他依赖此类的对象访问)。

依赖查找[编辑]

依赖查找更加主动,在需要的时候通过调用框架提供的方法来获取对象,获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

透彻理解IoC(控制反转)

 引述:IoC(控制反转:Inverse of Control)是Spring容器的内核,AOP、声明式事务等功能在此基础上开花结果。但是IoC这个重要的概念却比较晦涩隐讳,不容易让人望文生义,...
  • u014563989
  • u014563989
  • 2017-02-15 09:26
  • 6218

什么是控制反转/依赖注入?

控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控...
  • makerule
  • makerule
  • 2015-11-25 16:13
  • 960

Spring中到底什么是控制反转

从接触spring框架开始,控制反转这个名词也不算陌生了,一直模模糊糊没用弄清楚它真正的含义,知道今天算是比较清楚地明白了。 讲spring中的控制反转,我们先要从一个例子说起: 比如一个类A中,...
  • zhujun_xiaoxin
  • zhujun_xiaoxin
  • 2016-05-11 20:02
  • 783

深入理解IOC控制反转及应用实例

一、IOC雏形 1、程序V1.0 话说,多年以前UT公司提出一个需求,要提供一个系统,其中有个功能可以在新春佳节之际给公司员工发送一封邮件。邮件中给大家以新春祝福,并告知发放一定数额的...
  • lqw05
  • lqw05
  • 2016-08-14 16:29
  • 1617

Spring框架中IoC(控制反转)的原理

一.IoC的基础知识以及原理: 1.IoC理论的背景:在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。即软件系统中对象之间的耦合,对...
  • u012561176
  • u012561176
  • 2015-05-26 12:18
  • 11303

控制反转理解,一个简单例子

http://www.cnblogs.com/liangjq/p/3994141.html    我觉得,框架是出于聪明的赖人之手。聪明是说他们开发封装每层框架,把复杂的操作全部封装在框架中。而...
  • xingchenxuanfeng
  • xingchenxuanfeng
  • 2016-03-24 10:21
  • 465

控制反转与依赖注入模式

Java 社群近来掀起了一阵轻量级容器的热潮,这些容器能够帮助开发者将来自不同项目的组件 组装成为一个内聚的应用程序。在它们的背后有着同一个模式,这个模式决定了这些容器进行组 件装配的方式。人们用...
  • zhoudaxia
  • zhoudaxia
  • 2014-06-27 22:54
  • 6456

依赖注入和控制反转的理解,写的太好了。

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家...
  • bestone0213
  • bestone0213
  • 2015-08-11 17:53
  • 37114

Spring入门--控制反转(IOC)与依赖注入(DI)

1.控制反转(Inversion of Control)与依赖注入(Dependency Injection) 控制反转即IoC (Inversion of Control),它把传统上由程序代码直接...
  • hy6688_
  • hy6688_
  • 2014-10-31 18:46
  • 9191

JAVA菜鸟学习日记——简单代码实现IOC控制反转

原来校招时候的时候刷过一道题——写段代码实现控制反转,现在终于有了些思路~自己留念,同时分享给大家。
  • Autobot_song
  • Autobot_song
  • 2016-12-22 20:08
  • 954
    个人资料
    • 访问:896489次
    • 积分:10197
    • 等级:
    • 排名:第1963名
    • 原创:45篇
    • 转载:632篇
    • 译文:0篇
    • 评论:72条
    最新评论