什么是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();
     }
 }

话说IOC(DI)的更多相关文章

  1. 关于依赖注入IOC/DI的感想

    之前一直不明白依赖注入有什么好处,甚至觉得它是鸡肋,现在想想,当时真是可笑. 这个想法正如同说接口是没有用处一样. 当整个项目非常庞大,各个方法之间的调用非常复杂,那么,可以想象一下,假设说没有任何的 ...

  2. Spring IOC/DI和AOP原理

    一 IOC/DI 1. 概念机原理 IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序.对象及其依赖对 ...

  3. 深入理解IoC/DI

    ------------------------------------------------------------------------ 理解IoC/DI 1.控制反转 --> 谁控制谁 ...

  4. IoC/DI基本思想的演变

    ---------------------------------------------------------------------------------- (1)IoC/DI的概念 IoC ...

  5. 工厂方法模式与IoC/DI

    IoC——Inversion of Control  控制反转 DI——Dependency Injection   依赖注入 1:如何理解IoC/DI        要想理解上面两个概念,就必须搞清 ...

  6. spring 依赖注入(IOC DI)

    依赖注入(IOC DI) 依赖注入的两种方式: 1. set注入 Spring要求使用set注入方式的时候,Bean需要提供一个无参数的构造方法.并提供一个属性的setter方法.例如: packag ...

  7. spring--学习之IOC DI

    2.1.1  IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器 ...

  8. spring ioc DI 理解

    下面是我从网上找来的一些大牛对spring ioc和DI的理解,希望也能让你对Spring ioc和DI的设计思想有更进一步的认识. 一.分享Iteye的开涛对Ioc的精彩讲解 Ioc—Inversi ...

  9. 工厂方法模式与IoC/DI控制反转和依赖注入

    IoC——Inversion of Control  控制反转 DI——Dependency Injection   依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁 ...

随机推荐

  1. [速记!vs调试技巧]

    当程序崩溃却又没有报错的时候,进入调试程序,断点处按Alt+7可以进入函数调用栈,甚至可以进入汇编栈,真的很有用,以后有时间学习汇编的话,估计这个功能会更加强大!

  2. bzoj2086【Poi2010】Blocks

    因为long long还有PE的事WA了一下午TAT 考虑一段可行区间的平均值肯定>=k 也就是说将每个数减去k以后,一段可行区间的和非负,求一段最长区间. 一段区间的和肯定是两个前缀和的差 先 ...

  3. 【Codeforces717F】Heroes of Making Magic III 线段树 + 找规律

    F. Heroes of Making Magic III time limit per test:3 seconds memory limit per test:256 megabytes inpu ...

  4. sobel算子的一些细节

    1. 形式 Gy 上下颠倒的 (*A表示卷积图像,忽略先): 看得出来,sobel算子感觉并不统一,特别是方向,我们知道matlab的图像格式是,x轴从左到右,y轴从上到下,原点在左上角. 所以,第二 ...

  5. C#直接赋值和反射赋值(无GC)的性能比较

    using System; using System.Reflection; using System.Diagnostics; using System.Runtime.InteropService ...

  6. Sql Server自动备份数据库,定期删除备份

    //实现:每天自动备份数据库,定期删除备份 //步骤:[开始]--[所有程序]--[Microsoft SQL Server 2005]--[SQL Server Management Studio] ...

  7. [Python] 网络爬虫和正则表达式学习总结

    以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset.beachmark等等.但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的.最近在国内一家互联网公司实习, ...

  8. MySQL SQL Mode及相关问题

    MySQL可以运行于不同的SQLMode下,Mode定义了MySQL应支持的SQL语法.数据校验等. 一.Mode会影响到日期类型.字符串类型等的插入操作.其中多种模式影响了对某些特殊字符如何理解的问 ...

  9. 使用github pages, hexo搭建个人博客教程

    具体的原理性的东西就不说了直接上教程,怕等下自己忘了. 一. github 阶段 申请一个github 账号并成功登录进去. 创建一个名字为xxx.github.io的空项目. 二. hexo 阶段 ...

  10. python之路十一

    RabbitMQ基本概念RabbitMQ , 是一个使用 erlang 编写的 AMQP (高级消息队列协议) 的服务实现. 简单来说, 就是一个功能强大的消息队列服务.通常我们谈到队列服务, 会有三 ...