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

最新文章

  1. ubuntu kylin 14.04安装配置redis-2.8.9(转)
  2. 29 个你必须知道的 Linux 命令
  3. 在SQL中使用PL/SQL函数存在的问题
  4. Codeforces Round #301 (Div. 2) E . Infinite Inversions 树状数组求逆序数
  5. Android原型界面设计工具
  6. linux命令 uname -r 和 uname -a 的解释与演示
  7. 景观指数分析 - 初识FragStats4.2
  8. vs code 的便捷使用
  9. WPF 10天修炼 第八天 - 形状、画刷和变换
  10. 机器学习之--kmeans聚类简单算法实例
  11. 洛谷P4016负载平衡
  12. Notepad++ 64位 插件管理器 PluginManager 安装 更新
  13. IOS屏幕旋转思路和实践
  14. 冒泡排序——JavaScript实现
  15. net core体系-web应用程序-4net core2.0大白话带你入门-11asp.net core 2.0 cookie的使用
  16. 学生与部门管理app-产品功能与界面的简单设计
  17. vue.js 传参 href传参 与router-link传参
  18. 解决linux更新apt软件源时报出GPG错误
  19. Codeforces 12D Ball cdq分治
  20. 爬虫_处理js动态加载

热门文章

  1. python ghost.py使用笔记
  2. 使用JDK实现动态代理
  3. opengl教程推荐
  4. Android-Sqlite-SQL操作增删改查
  5. AngularJS Backbone.js Ember.js 对比
  6. SQL Server 2014与TFS 2013的错误(TF53001:管理员已取消数据库操作)
  7. 2:C#TPL探秘
  8. Gogland配置- 修改Go源代码tab值
  9. 初识阿里开源诊断工具Arthas
  10. “全栈2019”Java多线程第一章:认识多线程