`
gaoyuntao2005
  • 浏览: 311156 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

入门 03 - 依赖注入DI

阅读更多


 IoC模式基本上是一个高层的概念,在Martin Fowler的Inversion of Control Containers and the Dependency Injection pattern中谈到,实现IoC有两种方式:Dependency Injection与Service Locator。您可以在下面的网址中找到该篇文章:
http://www.martinfowler.com/articles/injection.html 
 Spring所采用的是Dependency Injection来实现IoC,中文翻译为依赖注入,依赖注入的意义是:「保留抽象接口,让组件依赖于抽象接口,当组件要与其它实际的对象发生依赖关系时,藉过抽象接口来注入依赖的实际对象。」
 看看下面这个程序:

public class BusinessObject {

    private FloppyWriter writer = new FloppyWriter();

    ....

  

    public void save() {

        ...

        writer.saveToFloppy();

 

    }

}


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

public interface IDeviceWriter {

    public void saveToDevice();

}

 

public class BusinessObject {

    private IDeviceWriter writer;

 

    public void setDeviceWriter(IDeviceWriter writer) {

        this.writer = writer;

    }

 

    public void save() {

        ....

        writer.saveToDevice();

    }

}

 

public class FloppyWriter implement IDeviceWriter {

    public void saveToDevice() {

        ....

        // 实际储存至Floppy的程序代码

    }

}

 

public class UsbDiskWriter implement IDeviceWriter {

    public void saveToDevice() {

        ....

        // 实际储存至UsbDisk的程序代码

    }

}


 如果今天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,透过setter注入依赖关系,而type 3 IoC,则在是建构函式上注入依赖关系,例如:

public class BusinessObject {

    private IDeviceWriter writer;

 

    public BusinessObject(IDeviceWriter writer) {

        this.writer = writer;

    }

 

    public void save() {

        ....

        writer.saveToDevice();

    }

}


 Spring鼓励的是setter injection,但也允许您使用constructor injection,使用setter或constructor来注入依赖关系视您的需求而定,使用constructor的好处之一是,您可以在建构物件的同时一并完成依赖关系的建立,然而如果要建立的对象关系很多,则会在建构函式上留下一长串的参数,这时使用setter会是个不错的选择,另一方面, setter可以有明确的名称可以了解注入的对象会是什么,像是setXXX()这样的名称会比记忆constructor上某个参数位置代表某个对象来得好。
 Type 1 IoC是interface injection,使用type 1 IoC时会要求实作接口,这个接口是为容器所用的,容器知道接口上所规定的方法,它可以呼叫实作接口的对象来完成依赖关系的注入,例如:

public interface IDependencyInjection {

    public void createDependency(Map dependObjects);

}

 

public class BusinessObject implement IDependencyInjection {

    private Map dependObjects;

 

    public void createDependency(Map dependObjects) {

        this.dependObject = dependObjects;

        // 在这边实现与BusinessObject的依赖关系

        ......

    }

 

    public void save() {

        ....

        writer.saveToDevice();

    }

}


 如果要完成依赖关系注入的对象,必须实现IDependencyInjection接口,并交由容器管理,容器会呼叫被管理对象的createDependency()方法来完成依赖关系的建立。
 在上面的例子中,type 1 IoC要求BusinessObject实现特定的接口,这就使得BusinessObject依赖于容器,如果日后BusinessObject要脱离目前这个容器,就必须修改程序,想想在更复杂的依赖关系中产生更多复杂的接口,组件与容器(框架)的依赖会更加复杂,最后使得组件无法从容器中脱离。
 所以type 1 IoC具有强的侵入性,使用它来实现依赖注入会使得组件相依于容器(框架),降低组件的重用性。

 Spring的核心是个IoC容器,您可以用setter或constructor的方式来实现您的业务对象,至于对象与对象之间的关系建立,则透过组态设定,让Spring在执行时期根据组态档的设定来为您建立对象之间的依赖关系,您不必特地撰写一些Helper来自行建立这些对象之间的依赖关系,这 不仅减少了大量的程序撰写,也降低了对象之间的耦合程度。

分享到:
评论

相关推荐

    Spring Ioc(依赖注入)入门例子--属性注入

    在本例“Spring Ioc(依赖注入)入门例子--属性注入”中,我们将关注如何通过属性注入来管理依赖。 属性注入是指Spring容器将一个对象的属性值设置为另一个对象的引用。这通常用于将服务对象注入到需要使用它们的...

    JavaEE spring 依赖注入DI入门案例

    JavaEE spring 依赖注入DI入门案例

    spring入门学习-2、IOC、DI知识.pdf

    DI(依赖注入)实际上是IOC(控制反转)思想的具体应用。在DI中,容器负责创建对象,并将对象注入到需要使用这些对象的地方。这意味着对象不再需要知道其依赖对象是如何创建的,也不需要通过new关键字或其他方式获取...

    Spring_01_入门篇_依赖注入(控制反转)_ANN

    在"Spring_01_入门篇_依赖注入(控制反转)_ANN"的学习过程中,你可以首先了解Spring的基本概念和IoC/DI原理,然后通过注解驱动的配置来实践创建和管理bean。接着,逐步探索三层架构的实现,从编写DAO、Service到...

    Java开发学习(二)----IOC、DI入门案例.doc

    在Java开发中,Spring框架的核心特性之一就是Inversion of Control(IoC,控制反转)和Dependency Injection(DI,依赖注入)。这两个概念是紧密相关的,理解它们有助于提升应用的可扩展性和模块化。 **IOC(控制...

    Spring_01_入门篇_依赖注入(控制反转)_XML

    它的核心特性是依赖注入(Dependency Injection,简称DI),也被称为控制反转(Inversion of Control,简称IOC)。这个特性使得开发者可以更专注于业务逻辑,而不需要过多地关注对象的创建和管理。 **依赖注入(DI...

    Spring框架控制反转IOC和依赖注入DI详解

    本文介绍了Spring框架中的控制反转IOC和依赖注入DI,欢迎阅读,共同学习,一起进步。 Spring框架基础参考:深入学习Spring基础 文章目录一.入门程序和IOC简介二.IOC-控制反转三.DI-依赖注入四. IOC和DI五.Spring...

    JavaEE技术-试验九.zip_Spring入门_依赖注入

    JavaEE技术实验九的核心主题是Spring框架的入门与依赖注入,以及结合Hibernate框架进行数据库操作。这个实验旨在帮助开发者理解如何在MyEclipse环境中利用Spring框架来实现服务层(Service Layer)和数据访问对象层...

    “IOC容器与DI依赖注入示例”文章提及

    在Java世界中,Spring框架是应用最广泛的轻量级企业级开发框架,它的一大核心特性就是Inversion of Control(控制反转,简称IOC)和Dependency Injection(依赖注入,简称DI)。这两者是紧密相关的概念,有助于简化...

    基于框架的Web开发-IoC(控制反转)和DI(依赖注入)入门.doc

    【控制反转(IoC)与依赖注入(DI)】是现代Web开发中,尤其是Spring框架中的核心概念。IoC和DI的主要目标是降低组件之间的耦合性,提高代码的灵活性和可维护性。 传统Java开发中,对象通常自行管理它们的依赖关系...

    .NET Core使用自定义服务(依赖注入方式) 适合新手入门

    依赖注入(Dependency Injection,简称DI)是.NET Core中一个关键特性,它有助于实现松散耦合,使得代码更易于测试和维护。本文将深入探讨如何在.NET Core中使用依赖注入来创建和使用自定义服务,特别适合初学者入门...

    Asp.ne2.0MVC实战入门教程-上-基础准备篇

    7. **依赖注入(Dependency Injection, DI)**: Asp.NET MVC支持依赖注入,允许开发者更方便地管理对象间的依赖关系,提高代码的可测试性和可扩展性。通过DI,可以轻松地替换或添加服务,实现解耦。 8. **单元...

    spring入门学习-hello,world

    Spring框架是Java开发中广泛应用的一个开源框架,以其强大的依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)功能而著名。它简化了Java应用程序的开发,使得组件...

    Java EE 框架整合 开发入门到实战-Spring+Spring MVC+MyBatis微课版复习笔记

    控制反转(IoC)和依赖注入(DI): - 控制反转是Spring框架的核心,它通过描述(如XML配置或注解)由第三方(Spring容器)生成或获取被依赖的实例,从而实现对象之间的解耦,减少程序间依赖,提升模块化程度。 - ...

    spring入门经典-附源代码

    依赖注入(Dependency Injection,DI)是Spring的核心特性之一,它允许我们将组件之间的依赖关系解耦,从而使代码更加灵活、易于测试。Spring提供了多种实现DI的方式,如XML配置、注解配置和Java配置。通过这些方式...

    Spring项目IOC入门案例、Spring项目DI入门案例的代码

    本文将深入探讨Spring的核心概念——依赖注入(Dependency Injection,简称DI)和控制反转(Inversion of Control,简称IOC),并结合提供的"Spring项目IOC入门案例、Spring项目DI入门案例的代码"进行详细解析。...

    spring依赖注入

    依赖注入(Dependency Injection,简称DI)允许我们解耦组件之间的关系,使得代码更易于维护和扩展。它通过外部源来管理对象及其依赖关系,而不是让对象自己创建或查找它们所依赖的对象。 在Spring框架中,依赖注入...

    spring4.0入门案例-helloworld

    首先,我们需要理解Spring的核心概念:依赖注入(Dependency Injection,简称DI)。在Spring中,我们不再手动创建对象并管理它们的依赖关系,而是由Spring容器负责这些工作。这样做的好处是可以提高代码的可测试性...

Global site tag (gtag.js) - Google Analytics