我读了很多关于这一点但我仍不清楚这些事情。我们说DI意味着在运行时将依赖关系注入依赖组件
Q1
什么是依赖?如果这些是在运行时创建的对象?
如果是,这是否意味着我们通过创建一个对象(由框架创建,即通过带有setter / constructor注入的xml文件实例化bean)将值注入变量中
Q2
我们在没有对象干预的情况下进行DI工作吗?
答案 0 :(得分:4)
从Wikipedia开始,DI模式中的所有元素都是对象。 依赖对象使用接口指定它所需的内容。 injector 对象决定哪些具体类(实例化对象)可以满足要求并将它们提供给依赖对象。
所以,这成为第二部分的是。
再次来自Wikipedia:
依赖注入模式的主要目的是允许 在给定依赖项的多个实现中进行选择 接口在运行时,或通过配置文件,而不是在 编译时间。
作为示例,考虑一个可以处理Encoder
的不同实现的安全服务。不同的编码算法可以包括SHA,MD5等。安全服务仅指定它需要“编码算法”的实例。然后,运行时DI环境将查找提供Encoder
接口的对象,然后注入安全服务。与DI一致,安全服务也利用了Inversion of Control (IoC);即它不本身决定使用什么实现,但它是DI运行时做出决定。
答案 1 :(得分:3)
不是一个精心设计的答案,只是为了让它更简单。
Ques1:
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
将能够阅读一些配置并创建必要的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 :是的。你是对的。