1.      IOC(控制反转) inverseof control是spring容器的内核,AOP.声明事务等功能在此基础上开花结果。

2.      通过实例理解IOC概念:

实例:《墨攻》电影中有一个场景:当刘德华所饰演的墨者革离到达梁国都城下,城上梁国守军问道:“来者何人?“刘德华回答道:“墨者革离”。以此场景通过一个java类为这个“城门叩问”的场景进行编剧。

MoAttract:通过演员安排剧本

public class MoAttack {

public voidcityuGateAsk(){

LiuDeHualdh=newLiuDeHua();//演员直接侵入脚本

ldh.responseAsk("墨者革离");

}

}

在上面代码注释处,作为具体角色饰演者的刘德华直接侵入到剧本中,使剧本和演员直接耦合在一起,如图:

一个明智的编剧在剧情创作时应该围绕故事的角色进行,而不应该考虑角色的具体饰演者,这样才可能在剧本投拍时自由地遴选任何适合的演员,而非绑定在刘德华一个人身上。

通过以上的分析,知道需要为盖剧本主人公革离定义一个接口:

public classMoAttack {

public void cityuGateAsk(){

GeLigeli=newLiuDeHua();//引入革离角色接口

geli.responseAsk("墨者革离");//通过接口开展剧情

}

}

墨攻,革离,刘德华三者的类图关系:

从上图中可以看出MoAttrack同时依赖于GeLi接口和LIuDeHua类,并没有达到所期望的剧本依赖于角色的目的。但是角色最终必须通过具体的演员才能拍摄,如何让LiuDeHua和剧本无关而又能完成GeLi的具体动作呢?当然是在拍摄时,导演将LiuDeHua安排在GeLi的角色上,导演将剧本、角色、饰演者装配起来:

通过引入导演,剧本和具体的饰演者解耦了,对应到软件中,导演像是一个装配器,将具体的饰演者赋予了剧本的角色。

现在可以反过来理解IoC的概念了。IOC(Inverseof control)的字面意思是控制反转,它包括两个内容:一是控制:二是反转。到底是什么东西的控制被反转了呢?对应前面的例子,控制是指选择GeLi角色扮演者的控制权;反转是指在这种控制权从《墨攻》剧本中移除,转交到了导演手中。对于软件来说,既是某一接口具体实现类的选择控制权从调用类中移除,转交给第三方裁决。

因为IOC不够开门见山,因此业界曾进行广泛的讨论,最终软件界的泰斗人物Martin Fowler提出了DI(依赖注入:Dependency Injection)的概念用以代替IoC,即调用类对接口实现类的依赖关系由第三方(容器或者协作类)注入,已移除调用类对接口实现类的依赖。

1.      Ioc类型

从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。

构造函数注入:

public class MoAttack {

private GeLigeli;

public MoAttack(GeLi geli){ //注入革离的具体扮演者

this.geli=geli;

}

public voidcityuGateAsk(){

geli.responseAsk("墨者革离");

}

}

MoAttack的构造函数并不关心具体是谁扮演革离的角色,只要在构造函数中传入扮演者按剧本要求完成角色功能即可。角色的具体扮演者由导演来安排,如下代码:

public classDirector {

public void direct(){

GeLigeli=newLiuDeHua();//指定角色的扮演者

MoAttackmoAttack=newMoAttack(geli);//注如具体扮演者到剧本中

moAttack.cityGateAsk();

}

}

属性注入:

有时,导演会发现,虽然革离是影片《墨攻》的第一主角,但是并非每一个场景都需要革离的出现,在这种情况下通过构造函数并不妥当,这是可以考虑使用属性注入。属性注入可以有选择的通过setter方法完成调用类所需依赖的注入,更加灵活方便。

public classMoAttack {

private GeLigeli;

public void setGeli(GeLi geli) { //属性注入

this.geli = geli;

}

public void cityGateAsk(){

geli.responseAsk("墨者革离");

}

}

Director通过Setter方法注入革离扮演者:

public classDirector {

public void direct(){

GeLigeli=newLiuDeHua();

MoAttackmoAttack=newMoAttack();

moAttack.setGeli(geli);  //调用setter方法注入

moAttack.cityGateAsk();

}

}

接口注入:

将调用类所有注入的方法抽取到一个接口中,调用类实现这一接口规定的注入方法,为了采用接口注入的方式,声明一个ActorArrangable接口

public interfaceActorArrangable {

void injectGeli(GeLi geli);

}

MoAttack通过接口方法注入革离扮演者

public classMoAttack implementsActorArrangable{

private GeLigeli;

public void injectGeli(GeLi geli){ //实现接口方法

this.geli=geli;

}

public void cityGateAsk(){

geli.responseAsk("墨者革离");

}

}

Director通过接口方法注入革离扮演者:

public classDirector {

public void direct(){

GeLigeli=newLiuDeHua();

MoAttackmoAttack=newMoAttack();

moAttack.injectGeli(geli);

moAttack.cityGateAsk();

}

}

由于接口注入需要额外声明一个接口,增加类的数目,而且它的效果和属性输入并无本质区别,因此不提倡使用。

http://blog.csdn.net/alex_sym/article/details/8255106

控制反转(IOC) 和依赖注入(DI) 的理解的更多相关文章

  1. 控制反转IOC与依赖注入DI

    理解 IOC  http://www.cnblogs.com/zhangchenliang/archive/2013/01/08/2850970.html IOC 相关实例      的http:// ...

  2. 控制反转(Ioc)和依赖注入(DI)

    控制反转IOC, 全称 “Inversion of Control”.依赖注入DI, 全称 “Dependency Injection”. 面向的问题:软件开发中,为了降低模块间.类间的耦合度,提倡基 ...

  3. iOS控制反转(IoC)与依赖注入(DI)的实现

    背景 最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能.Java语言自带的注解特性为IoC和DI带来了极大 ...

  4. 轻松学,浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI) 依赖注入和控制反转的理解,写的太好了。

    轻松学,浅析依赖倒置(DIP).控制反转(IOC)和依赖注入(DI) 2017年07月13日 22:04:39 frank909 阅读数:14269更多 所属专栏: Java 反射基础知识与实战   ...

  5. 控制反转IOC与依赖注入DI【转】

    转自:http://my.oschina.net/1pei/blog/492601 一直对控制反转.依赖注入不太明白,看到这篇文章感觉有点懂了,介绍的很详细. 1. IoC理论的背景我们都知道,在采用 ...

  6. 【转载】浅析依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

    原文地址 http://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...

  7. 控制反转IOC与依赖注入DI - 理论篇

    学无止境,精益求精 十年河东十年河西,莫欺少年穷 昨天是五一小长假归来上班的第一天,身体疲劳,毫无工作热情.于是就看看新闻,喝喝茶,荒废了一天 也就在昨天,康美同事张晶童鞋让我学习下IOC的理论及实现 ...

  8. 依赖倒置(DIP)、控制反转(IOC)和依赖注入(DI)

    原文: https://blog.csdn.net/briblue/article/details/75093382 写这篇文章的原因是这两天在编写关于 Dagger2 主题的博文时,花了大量的精力来 ...

  9. 20181123_控制反转(IOC)和依赖注入(DI)

    一.   控制反转和依赖注入: 控制反转的前提, 是依赖倒置原则, 系统架构时,高层模块不应该依赖于低层模块,二者通过抽象来依赖 (依赖抽象,而不是细节) 如果要想做到控制反转(IOC), 就必须要使 ...

  10. Spring框架学习笔记(1)——控制反转IOC与依赖注入DI

    Spring框架的主要作用,就是提供了一个容器,使用该容器就可以创建并管理对象.比如说Dao类等,又或者是具有多依赖关系的类(Student类中包含有Teacher类的成员变量) Spring有两个核 ...

随机推荐

  1. MySQL—练习

    前面学习了MySQL的语句的基本用法,这里就开始做一些MySQL练习,这套题目一共45题,属于比较简单的,初学先试着做这个. 参考链接:https://www.cnblogs.com/SJP666/p ...

  2. tomcat下manager配置

    1 安装Tomcat前需要先安装JDK.安装Tomcat后测试Tomcat成功安装. Tomcat Manager是Tomcat自带的.用于对Tomcat自身以及部署在Tomcat上的应用进行管理的w ...

  3. 我的Jquery参考词典

    由于工作主要用到Asp.net Mvc+Jquery,最近也看了一些Jquery的书籍,在此总结以备回顾. 已读书籍:<Jquery In Action> 主要讲了些Jquery语法以及A ...

  4. cloudera search环境搭建搭建-solrcloud

    转载:http://blog.csdn.net/xiao_jun_0820/article/details/40539291 本文基于Cloudera Manager5.0.0,所有服务基于CDH5. ...

  5. WPF制作歌词动画

    最近再做一个UWP的音乐播放器,今天实现了歌词动画,不是滚动的,滚动的慢慢研究 思路:在右边放了三个textBlock,设置 textBlock的effect属性 <TextBlock.Effe ...

  6. Promise之你看得懂的Promise

    本文由作者陈旭锋(任职网易考拉)授权网易云社区发布. Promise源码详解 学习知识要善于思考,思考,再思考. -- 爱因斯坦 1.回调地狱 曾几何时,我们的代码是这样的,为了拿到回调的结果,不得不 ...

  7. 循环语句(循环for与while等)

    1.1for循环 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. java后台简单从腾讯云下载文件通知前端以附件的形式保存

    腾讯云对象存储和阿里云差不多 这是我的配置 /** * 腾讯云client * @return COSClient */ public static COSClient getCOSClient() ...

  9. LLDB 和Chisel 使用例子

    打印变量 打印数字 (lldb) p/d 16 16 16 进制格式 (lldb) p/x 16 0x10 2 进制格式 (lldb) p/t 16 0b00000000000000000000000 ...

  10. axios跨域问题

    最近遇到一个很奇怪的问题,在帮助测试妹子做一个小项目的时候,遇到了一个很棘手的问题,axios请求的时候报404,请求type是options,我当时的第一反应就是跨域问题,果然在console里面还 ...