Dependency Injection

Dependency Injection

        IoC模式基本上是一个高层的概念,在 Martin Fowler 的
Inversion of Control Containers and the Dependency Injection 中谈到,实现IoC有两种方式: Dependency Injection与Service Locator, Castle 所采用的是Dependency Injection 来实现 IoC,中文翻译为依赖注入,依赖注入的意义是:“保留抽象接口,让组件依赖于抽象接口,当组件要与其它实际的对象发生依赖关系时,藉过抽象接口来注入依赖的实际对象。”

看看下面这个程序:

Dependency Injection
Dependency Injection
public
 
class
 BusinessObject 
Dependency Injection

Dependency Injection    
private FloppyWriter writer = new FloppyWriter(); 
Dependency Injection    Dependency Injection
Dependency Injection    
Dependency InjectionDependency Injection    
public void Save() Dependency Injection
Dependency Injection        Dependency Injection 
Dependency Injection        writer.SaveToFloppy(); 
Dependency Injection
Dependency Injection    }
 
Dependency Injection}

 
Dependency Injection
Dependency Injection
Dependency Injection

BusinessObject 依赖于实际的 FloppyWriter,为了让 BusinessObject 获得重用性,不让 BusinessObject 直接依赖于实际的 FloppyWriter,而是依赖于抽象的接口:


Dependency Injection
Dependency Injection
public
 
interface
 IDeviceWriter 
Dependency Injection

Dependency Injection    
public void SaveToDevice(); 
Dependency Injection}

 
Dependency Injection
Dependency InjectionDependency Injection

public
 
class
 BusinessObject 
Dependency Injection

Dependency Injection    
private IDeviceWriter writer; 
Dependency Injection
Dependency Injection    
public DeviceWriter
Dependency InjectionDependency Injection    
Dependency Injection{

Dependency Injection      Set
Dependency InjectionDependency Injection      
Dependency Injection{

Dependency Injection        
this.writer = value; 
Dependency Injection      }

Dependency Injection    }
 
Dependency Injection
Dependency InjectionDependency Injection    
public void Save() Dependency Injection
Dependency Injection        Dependency Injection
Dependency Injection        writer.SaveToDevice(); 
Dependency Injection    }
 
Dependency Injection}

 
Dependency Injection
Dependency InjectionDependency Injection

public
 
class
 FloppyWriter : IDeviceWriter 
Dependency Injection

Dependency InjectionDependency Injection    
public void SaveToDevice() Dependency Injection
Dependency Injection        Dependency Injection
Dependency Injection        
// 实现储存至Floppy的程序代码 
Dependency Injection
    }
 
Dependency Injection}

 
Dependency Injection
Dependency InjectionDependency Injection

public
 
class
 UsbDiskWriter : IDeviceWriter 
Dependency Injection

Dependency InjectionDependency Injection    
public void SaveToDevice() Dependency Injection
Dependency Injection        Dependency Injection
Dependency Injection        
// 实现储存至UsbDisk的程序代码 
Dependency Injection
    }
 
Dependency Injection}

 
Dependency Injection

如果今天BusinessObject想要与UseDiskWriter对象发生依赖关系,可以这么建立: businessObject.SetDeviceWriter(new UsbDiskWriter());

由于BusinessObject依赖于抽象接口,在需要建立依赖关系时,可以通过抽象接口注入依赖的实际对象。

依赖注入在Martin Fowler的文章中谈到了三种实现方式:Interface injection、Setter injection 与 Constructor injection。并分别称其为Type 1 IoC、Type 2 IoC 与 Type 3 IoC。

上面的BusinessObject所实现的是Type 2 IoC,通过属性注入依赖关系,而Type 3 IoC,则在是构造函数上注入依赖关系,例如:


Dependency Injection
Dependency Injection
public
 
class
 BusinessObject 
Dependency Injection

Dependency Injection    
private IDeviceWriter writer; 
Dependency Injection
Dependency InjectionDependency Injection    
public BusinessObject(IDeviceWriter writer) Dependency Injection
Dependency Injection        
this.writer = writer; 
Dependency Injection    }
 
Dependency Injection
Dependency InjectionDependency Injection    
public void Save() Dependency Injection
Dependency Injection        Dependency Injection
Dependency Injection        writer.SaveToDevice(); 
Dependency Injection    }
 
Dependency Injection}

 
Dependency Injection
Dependency Injection

转载于:https://www.cnblogs.com/Jebel/archive/2008/06/13/1219257.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111013.html原文链接:https://javaforall.net

(0)
上一篇 2021年7月27日 下午12:00
下一篇 2021年7月27日 下午1:00


相关推荐

  • SpringWS创建webservice服务端及客户端

    SpringWS创建webservice服务端及客户端一、服务端下图主要目录结构,这个是完整的,下面,我们就来构建1.1、创建springinitializr,下一步1.2选中springweb,下一步,最后创建1.3导入依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web- services&

    2022年10月3日
    4
  • 缓冲流、转换流、序列化流、Files

    缓冲流、转换流、序列化流、Files

    2021年5月19日
    129
  • tomcat域名重定向

    tomcat域名重定向一 问题来源今天在给公司做网站时 遇到了这样一个问题 公司网站为 www aaa com 但是地址栏输入 aaa com 也能够跳转 为了使 URL 权重集中 具体这块也不太懂 需要实现使访问地址要在 www aaa com 首先想到的方法是 js 重定向 但是这样用户体验会不太好 接下来想到的是 fillter 于是接下来上网查资料 找到一个更好的方法 二 解

    2026年3月19日
    2
  • 使用panel1,切换页面

    使用panel1,切换页面定义变量UserControl1urs1_Control;UserControl2urs2_Control;UserControl3urs3_Control;UserControl4u

    2022年7月3日
    27
  • Maven中央仓库地址配置大全

    Maven中央仓库地址配置大全第一种 直接在项目的 pom xml 文件中进行修改 不推荐 尤其是在多人协助的开发过程中非常的费事费力 第二种 将 Maven 的远程仓库统一的配置到 Maven 的 Settings xml 的配置文件中 Maven 中央仓库地址大全 1 阿里中央仓库 首推 1 repository id alimaven id name aliyunmaven name url http mav url repository

    2026年3月19日
    1
  • java list去重_JAVA基础-List去重的6种方式[通俗易懂]

    java list去重_JAVA基础-List去重的6种方式[通俗易懂]简述java开发中经常会遇到List去重这个工作,现在就来整理一下List去重的6种方式。方法代码以及效率测试模拟测试数据相关代码:importjava.util.LinkedList;importjava.util.List;/***@ClassName:ListCleatMain*@Description:模拟数据进行List去重测试*@author:ssqxx*@date:…

    2022年5月25日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号