什么是IOC(DI)
书上的东东,因为说的太严谨,所以不太容易懂,其实也没那么复杂。
举几个例子:
1、文明点的:中午太热,不想出去吃饭,所以希望同事能帮忙带饭,现在有了点外卖平台,我们就可以直接在网上点,然后就有人送来了,然后就。。。
2、粗鲁点的:想嘿嘿嘿,自己找女朋友,还得哄她,还不能急,所以去鸡舍,然后就。。。。。
。。。。。
以上列子可以看出,其实IOC(DI)就是我们想做某件事,但是又要依赖另一个物体,并且另一个物体还是可变的(别告诉我,你就只有过一个女朋友),每次都需要我们亲自去处理,现在都有人帮我们做了,我们就只是告诉他我们需要的东西就行了,然后他会帮我们找到我们所需要的东西。
IOC(DI) 在代码中的实现
注:IOC(DI) 在代码中是针对接口和实现类的,如一个接口对应两个或两个以上的实现类。
“说起来简单做起来难”,现在就列出《Spring 3.x 企业应用开发实战》中IOC的Demo,主要参考的是电影《墨攻》,主演:刘德华;剧情:刘德华饰演的墨者革离到达梁国都城下,城上梁国守军问到“来者何人?”革离回答:“墨者革离!”
/** * MoAttack:通过演员安排剧本 */ public class MoAttack { // 引用革离角色接口 private GeLi geLi = new LiuDeHua(); public void cityGateAsk() { // 通过接口开展剧情 geLi.responseAsk("墨者革离"); } }
由此可以看出,剧本需要革离这个角色,革离这个角色又可以有多个人来饰演,也就是说GeLi这个接口有多个实现类。每次都要写剧本的人去考虑演员,好像有点累,这本来就应该是导演的美差嘛。所以应该是以下这个结构:
导演选择剧本,剧本决定角色,导演来选择角色。
IOC的类型
从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。
构造函数注入
/** * MoAttack:通过构造函数注入革离扮演者 */ public class MoAttack { // 引用革离角色接口 private GeLi geLi; // 注入革离的具体扮演者 public MoAttack(GeLi geLi) { this.geLi = geLi; } public void cityGateAsk() { geLi.responseAsk("墨者革离"); } }
导演角色也就是所说的容器
public class Director { public void direct() { // 指定角色的扮演者 GeLi geLi = new LiuDeHua(); // 注入扮演者到剧本中 MoAttack attack = new MoAttack(geLi); attack.cityGateAsk(); } }
属性注入
/** * MoAttack:通过属性注入革离扮演者 */ public class MoAttack { // 引用革离角色接口 private GeLi geLi; // 注入革离的具体扮演者 public void setGeLi (GeLi geLi) { this.geLi = geLi; } public void cityGateAsk() { geLi.responseAsk("墨者革离"); } }
public class Director { public void direct() { // 指定角色的扮演者 GeLi geLi = new LiuDeHua(); // 注入扮演者到剧本中 MoAttack attack = new MoAttack(); attack.setGeLi(geLi); attack.cityGateAsk(); } }
接口注入
public interface ActorArrangable { void injectGeLi(GeLi geLi); }
/** * MoAttack:通过接口方法注入革离扮演者 */ public class MoAttack implements ActorArrangable { // 引用革离角色接口 private GeLi geLi; public void cityGateAsk() { geLi.responseAsk("墨者革离"); } @Override public void injectGeLi(GeLi geLi) { this.geLi = geLi; } }
public class Director { public void direct() { // 指定角色的扮演者 GeLi geLi = new LiuDeHua(); // 注入扮演者到剧本中 MoAttack attack = new MoAttack(); attack.injectGeLi(geLi); attack.cityGateAsk(); } }