Ioc(Inversion of Control)中文翻译为“控制反转”,Ioc的抽象概念是依赖关系转移,即“程序与实现必须依赖于抽象”。
控制反转最常见的实现方式就是依赖注入(Depedency Injection),依赖注入的含义是:保留抽象接口,让组件依赖抽象接口,当组件要与其他对象发生依赖关系时,通过抽象接口来注入依赖的实际对象。
在解说Ioc之前,先看一个设计的例子:
设计一个保存数据到软盘、USB设备的程序。
 
一、反面例子,没有使用Ioc
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:13:32
 * 
 * 
 */
public class FloppyWriter {
    public void saveToDevice() {
        System.out.println("FloppyWriter.saveToDevice(): Floppy!");
    }
}

 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:14:25
 * 
 * 
 */
public class BusinessObject {
    private FloppyWriter floppyWriter;
 
    public FloppyWriter getFloppyWriter() {
        return floppyWriter;
    }
 
    public void setFloppyWriter(FloppyWriter floppyWriter) {
        this.floppyWriter = floppyWriter;
    }
 
    public void save() {
        System.out.println("----BusinessObjectsave()....");
        floppyWriter.saveToDevice();
        System.out.println("----BusinessObjectsave()....");
    }
}

 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 1:15:17
 * 
 * 
 */
public class Client {
    public static void main(String args[]){
        //
        BusinessObject businessObject=new BusinessObject();
        FloppyWriter floppyWriter=new FloppyWriter();
        businessObject.setFloppyWriter(floppyWriter);
 
        //
        businessObject.save();
    }
}

 
二、Ioc的实现推荐实现方式:setter方式
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:38:32
 * 
 */
public interface IDeviceWriter {
    public void saveToDevice();
}

 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:44:46
 * ,
 */
public class FloppyWriter implements IDeviceWriter{
    public void saveToDevice() {
        System.out.println("FloppyWriter.saveToDevice(): Floppy!");
    }
}

 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:44:57
 * ,USB
 */
public class USBWriter implements IDeviceWriter{
    public void saveToDevice() {
        System.out.println("USBWriter.saveToDevice(): USB!");
    }
}

 
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:40:24
 * 
 */
public class BusinessObject {
    private IDeviceWriter writer;
 
    public IDeviceWriter getWriter() {
        return writer;
    }
 
    public void setWriter(IDeviceWriter writer) {
        this.writer = writer;
    }
 
    /**
     * 
     */
    public void save(){
        System.out.println("----BusinessObjectsave()....");
        writer.saveToDevice();
        System.out.println("----BusinessObjectsave()....");
    }
}

 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:51:09
 * 
 */
public class Client {
    public static void main(String args[]){
        //
        IDeviceWriter floppyWriter=new FloppyWriter();
        IDeviceWriter usbWriter=new USBWriter();
 
        //
        BusinessObject businessObject1=new BusinessObject();
        BusinessObject businessObject2=new BusinessObject();
 
        //
        businessObject1.setWriter(floppyWriter);
        businessObject1.save();
 
        System.out.println();
 
        //
        businessObject2.setWriter(usbWriter);
        businessObject2.save();
    }
}

 
三、Ioc的实现推荐实现方式:constructor方式
在setter方式基础上修改,IDeviceWriter、FloppyWriter、USBWriter不变,BusinessObject和
Client类修改为:
 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:32:03
 * 
 */
public class BusinessObject {
    private IDeviceWriter writer;
 
    public BusinessObject() {
    }
 
    public BusinessObject(IDeviceWriter writer) {
        this.writer = writer;
    }
 
    public IDeviceWriter getWriter() {
        return writer;
    }
 
    public void setWriter(IDeviceWriter writer) {
        this.writer = writer;
    }
 
    /**
     * 
     */
    public void save() {
        System.out.println("----BusinessObjectsave()....");
        writer.saveToDevice();
        System.out.println("----BusinessObjectsave()....");
    }
}

 
/**
 * Created by IntelliJ IDEA.
 * User: leizhimin
 * Date: 2007-9-25
 * Time: 11:35:52
 * 
 */
public class Client {
    public static void main(String args[]){
        //
        IDeviceWriter floppyWriter=new FloppyWriter();
        IDeviceWriter usbWriter=new USBWriter();
 
        //
        BusinessObject businessObject1=new BusinessObject(floppyWriter);
        BusinessObject businessObject2=new BusinessObject(usbWriter);
 
        //
        businessObject1.save();
        System.out.println();
        businessObject2.save();
    }
}

 
两种实现方式执行的结果相同:
----开始调用业务组件BusinessObject的save()方法....
调用FloppyWriter.saveToDevice()方法: 保存到了Floppy设备上!
----结束调用业务组件BusinessObject的save()方法....
----开始调用业务组件BusinessObject的save()方法....
调用USBWriter.saveToDevice()方法: 保存到了USB设备上!
----结束调用业务组件BusinessObject的save()方法....
Process finished with exit code 0
本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/43900,如需转载请自行联系原作者

Ioc的推荐实现方式相关推荐

  1. Spring总结四:IOC和DI 注解方式

    首先我们要了解注解和xml配置的区别: 作用一样,但是注解写在Bean的上方来代替我们之前在xml文件中所做的bean配置,也就是说我们使用了注解的方式,就不用再xml里面进行配置了,相对来说注解方式 ...

  2. 网易云音乐的推荐音乐方式与算法漫谈

    网易云音乐的推荐音乐方式与算法漫谈 字数3131阅读8588评论13喜欢70 网易云音乐在我看来在各方面都是较为出色的音乐APP,网上也有各种体验报告.产品分析,但都比较偏向交互和前端.所以,我决定对 ...

  3. Spring IOC容器-注解的方式

    注解方式可以简化spring的IOC容器的配置,但不利于后期维护,对象之间的依赖关系不能像xml文件一样方便查阅,一目了然. 注解可以和XML配置一起使用. 使用注解步骤: 1)先引入context名 ...

  4. Spring IoC和DI XML方式 注解方式 依赖注入 AOP面向切面

    初识Spring框架 时代变迁 原始时代我们用一个jsp搞定一切,但如此开发大型项目时我们遇到了问题,前端美化的代码和后端的代码交织,代码中又有html.js.css样式,又有业务逻辑和数据库访问代码 ...

  5. Spring入门到精通:第二章 IOC容器(XML方式):1.IOC概念

    百度百科表述: 控制反转(Inversion of Control,缩写为IOC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependenc ...

  6. Spring 框架 详解 (四)------IOC装配Bean(注解方式)

    Spring的注解装配Bean Spring2.5 引入使用注解去定义Bean @Component  描述Spring框架中Bean Spring的框架中提供了与@Component注解等效的三个注 ...

  7. Spring IOC容器-注解的方式【更简化】

    ----更加简化的版本 UserAction.java import javax.annotation.Resource;import org.springframework.stereotype.C ...

  8. Spring IoC注入三种方式

    三种注入方式: setter & getter 注入 构造函数注入 p命名空间注入 有两个实体类 student: public class Student {String name;int ...

  9. Spring入门到精通:第二章 IOC容器(XML方式):2.IOC演变

    前言 我们来看下IOC的演变历程,这里我们要明白设计的核心就是要降低耦合度. 假设我们有一个UserService和UserDao. 准备工作 创建UserDao: package com.kfit. ...

最新文章

  1. java使用ssh连接Linux并执行命令
  2. python基础——if语句/条件控制
  3. eclipse 快捷键大全
  4. python中的列表和元组_python中列表和元组的区别
  5. 用MySQL-zrm来备份和恢复MySQL数据库
  6. spring初始化在ServletContextListener实现类中获取spring注入对象
  7. spring+hibernate的clob大字段处理
  8. 解决iPhone、iPad 或 iPod touch 无法连接Wi-Fi网络问题
  9. TensorFlow by Google过拟合优化 Machine Learning Foundations: Ep #7 - Image augmentation and overfitting
  10. 有点累了?不如看看兵法三十六计。
  11. 一个特别NB的技术网站
  12. 转载-史密斯(smith)圆图讲解-基础内容
  13. .NET生成ICO图标
  14. 管理小故事100例3
  15. cdr2020永久序列号及试用过期解决
  16. 1.槑 2.囧 3.烎 4.兲 5.氼 6.砳 7.嘦 8.嫑 9.嘂 10.圐圙 11.玊 12.孖 13.砼 怎么读
  17. 网易微专业python爬虫工程师一期多久_有木有人上过网易云课堂的 Python Web 微专业,怎么样?...
  18. 安卓逆向010之实战破解内购(斗地主)
  19. 力扣解法汇总2013-检测正方形
  20. 不经一番寒彻骨,那有冰冻三尺,那有不经波折的人生?

热门文章

  1. pacemaker集群管理相关命令
  2. halfstone 原理_HashMap的结构以及核心源码分析
  3. python爬虫中for循环无法每一段输出_1024程序员节送你一套爬虫玩玩
  4. __getitem__的作用
  5. vim+python3的字符串却不能使用中文
  6. echart多个柱状图 设置y轴显示_Origin神教程:柱状图还是2D的吗?也没有误差棒?...
  7. Python环境下的数据库编程
  8. 中国移动研究院2020春招技术综合JAVA在线编程题第二题
  9. 2020 6-7月 每日花语
  10. Node搭建静态资源服务器时后缀名与响应头映射关系的Json文件