在依赖注入什么是依赖?

时间:2012-08-05 07:30:28

标签: dependency-injection

我读了很多关于这一点但我仍不清楚这些事情。我们说DI意味着在运行时将依赖关系注入依赖组件

Q1

  

什么是依赖?如果这些是在运行时创建的对象?

如果是,这是否意味着我们通过创建一个对象(由框架创建,即通过带有setter / constructor注入的xml文件实例化bean)将值注入变量中

Q2

  

我们在没有对象干预的情况下进行DI工作吗?

3 个答案:

答案 0 :(得分:4)

Q1

Wikipedia开始,DI模式中的所有元素都是对象。 依赖对象使用接口指定它所需的内容。 injector 对象决定哪些具体类(实例化对象)可以满足要求并将它们提供给依赖对象。

所以,这成为第二部分的

Q2

再次来自Wikipedia

  

依赖注入模式的主要目的是允许   在给定依赖项的多个实现中进行选择   接口在运行时,或通过配置文件,而不是在   编译时间。

作为示例,考虑一个可以处理Encoder的不同实现的安全服务。不同的编码算法可以包括SHA,MD5等。安全服务仅指定它需要“编码算法”的实例。然后,运行时DI环境将查找提供Encoder接口的对象,然后注入安全服务。与DI一致,安全服务也利用了Inversion of Control (IoC);即它不本身决定使用什么实现,但它是DI运行时做出决定。

答案 1 :(得分:3)

不是一个精心设计的答案,只是为了让它更简单。

Ques1:

class Dependent {
  propertyA = new PropertyA();
  propertyB = new PropertyB();
}

此处Dependent取决于propertyApropertyB。以上关系是依赖的一个例子。

如果这些是在运行时创建的对象?是。

如果是的话......?是的也是

问题2:是的。


详细信息包含在

下面

情景1:

class Dependent {
  DBConnection connection = new OracleConnection();
}

Dependent课程高度耦合。除非我们更改代码,否则无法更改连接。因此,如果客户需要MySQLConnection(),我们将不得不更改代码并为其提供另一个exe / jar。


情景2:

class Dependent {
  DBConnection connection = ConnectionFactory.createConnection();
}

这样做要好得多,因为ConnectionFactory将能够阅读一些配置并创建必要的connection

但是,它仍然会给模拟Dependent类带来一些困难。在这些场景中很难创建模拟。什么?


情景3:

class Dependent {
  DBConnection connection;

  setConnection(DBConnection connection) {
    this.connecttion = connection;
  }
}

class DependencyInjector {
  inject() {
    // wire them together every dependent & their dependency!
    Dependent dependent = indentiyDepenentSomeSmartWay();
    DBConnection connection = indentiyConnectionSomeSmartWay();
    dependent.setConnection(connection);
  }
}

我们的DependencyInjector是一个聪明的课程,知道所有必要的信息!以上Dependent课程是干净的&简单。很容易模拟它们进行单元测试,可以使用配置进行配置。

那些对象创建&耦合是分离的!

答案 2 :(得分:1)

用简单的语言回答你的问题,

#1: 依赖注入是通过赋予它所需的对象来满足一个对象的需要。 让我们看一个例子:

通常在企业应用程序中,我们使用一种体系结构,其中服务调用DAO层,DAO执行所有与数据库相关的内容。因此DAO的服务需求和对象可以调用所有DAO方法。

考虑到我们有一个实体对象 -

假设我们有一个DAO - PersonDAO。

public interface PersonDAO {
    void addPerson(Person person);
    void updatePerson(Person person);
    void deletePerson(int personId);
}

和服务 - PersonService。

public class PersonServiceImpl {
    private PersonDAO personDAO;

    public void addPerson() {
        //some code specific to service.
        //some code to create Person obj.
        personDAO.add(person);
    }
}

正如您所见,PersonService正在使用PersonDAO对象来调用其方法。 PersonService依赖于PersonDAO。所以PersonDAO是依赖项,PersonService是依赖对象。

通常在像Spring这样的框架中,这些依赖项是由框架本身注入的。加载应用程序上下文时,将创建所有这些依赖项对象并将其放入Container中,并在需要时使用它们。由于依赖对象的创建方式,控制反转(IoC)的概念与依赖注入密切相关。

例如,您可以在PersonService中创建PersonDAO对象     PersonDAO personDAO = new PersonDAOImpl();

但是在Spring的情况下,你只是在PersonService中为PersonDAO定义一个属性,并为它提供一个setter,spring用它来设置依赖。这里依赖的创建由框架而不是使用它的类来处理,因此它被称为控制反转。

#2 :是的。你是对的。