Dependency injection 在依赖项注入中,什么是依赖项?

Dependency injection 在依赖项注入中,什么是依赖项?,dependency-injection,Dependency Injection,我知道他读了很多关于这方面的书,但我仍然不清楚其中的内容。我们说DI意味着在运行时将依赖项注入到依赖组件中 Q1 什么是依赖关系?如果这些是在运行时创建的对象 如果是,这是否意味着我们通过创建一个对象(由框架创建,即使用setter/constructor注入通过xml文件实例化bean)将值注入变量 Q2 我们做DI是为了在没有对象干预的情况下工作 Q1 从中,DI模式中的所有元素都是对象。依赖对象使用接口指定它需要什么。injector对象决定哪些具体类(实例化对象)可以满足需求,并将它们提

我知道他读了很多关于这方面的书,但我仍然不清楚其中的内容。我们说DI意味着在运行时将依赖项注入到依赖组件中

Q1

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

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

Q2

我们做DI是为了在没有对象干预的情况下工作

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

所以,这就变成了对第二部分的肯定

问题2 同样来自:

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


作为一个例子,考虑一个安全服务,它可以执行<代码>编码器< /代码>的不同实现。不同的编码算法可能包括SHA、MD5等。安全服务只指定它需要一个“编码算法”实例。然后,运行时DI环境将查找提供

Encoder
接口的对象,然后注入安全服务。与DI一样,安全服务也在利用;i、 e.它本身并不决定使用什么实现,而是由DI运行时来决定。

这不是一个复杂的答案,只是让它更简单而已

问题1:

class Dependent {
  propertyA = new PropertyA();
  propertyB = new PropertyB();
}
此处
Dependent
依赖于
propertyA
propertyB
。上面的关系是依赖关系的一个例子

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

如果是。。。。?也是

问题2:是的


详细信息包括在下面

情景1:

class Dependent {
  DBConnection connection = new OracleConnection();
}
Dependent
类是高度耦合的。因为除非我们更改代码,否则无法更改连接。因此,如果客户需要MySQLConnection(),我们必须更改代码并为他们提供另一个exe/jar


情景2:

class Dependent {
  DBConnection connection = ConnectionFactory.createConnection();
}
这会更好,因为,
ConnectionFactory
将能够读取一些配置并创建必要的
连接

但是,模仿
依赖的
类仍然会带来一些困难。在这些场景中很难创建mock。然后呢


情景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
类是干净而简单的。很容易模拟它们进行单元测试,可以使用配置进行配置


这些对象的创建和耦合是分离的

用简单的话回答你的问题

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

通常,在企业应用程序中,我们使用一种体系结构,其中在服务中调用DAO层,DAO完成所有与数据库相关的工作。因此,服务需要和DAO的对象调用所有DAO方法

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

假设我们有一把刀——人山道

public interface PersonDAO {
    void addPerson(Person person);
    void updatePerson(Person person);
    void deletePerson(int personId);
}
还有一个服务人员

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对象调用其方法。人的服务依赖于人。所以PersonDAO是依赖对象,PersonService是依赖对象

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

例如,您可以在PersonService中创建PersonDAO对象作为 PersonDAO PersonDAO=新的PersonDAOImpl()

但是对于spring,您只是在PersonService中为PersonDAO定义一个属性,并为它提供一个setter,spring使用它来设置依赖项。在这里,依赖项的创建由框架负责,而不是由使用它的类负责,因此称为控制反转


对于#2:是。你是对的。

类相关的{Dependent obj=new Dependent();}
也是一样的?字面意思是:如果类的对象是由框架在运行时创建的,那么该类就不依赖于该对象。否则(在类代码中创建)它是。@rd4code是,类似于:)。请参阅最新编辑以了解情况。检查此链接,它提供了示例说明。当做