Dependency injection 在依赖项注入中,什么是依赖项?
我知道他读了很多关于这方面的书,但我仍然不清楚其中的内容。我们说DI意味着在运行时将依赖项注入到依赖组件中 Q1 什么是依赖关系?如果这些是在运行时创建的对象 如果是,这是否意味着我们通过创建一个对象(由框架创建,即使用setter/constructor注入通过xml文件实例化bean)将值注入变量 Q2 我们做DI是为了在没有对象干预的情况下工作 Q1 从中,DI模式中的所有元素都是对象。依赖对象使用接口指定它需要什么。injector对象决定哪些具体类(实例化对象)可以满足需求,并将它们提供给依赖对象 所以,这就变成了对第二部分的肯定 问题2 同样来自: 依赖项注入模式的主要目的是允许 在给定依赖项的多个实现中进行选择 在运行时,或通过配置文件,而不是在 编译时Dependency injection 在依赖项注入中,什么是依赖项?,dependency-injection,Dependency Injection,我知道他读了很多关于这方面的书,但我仍然不清楚其中的内容。我们说DI意味着在运行时将依赖项注入到依赖组件中 Q1 什么是依赖关系?如果这些是在运行时创建的对象 如果是,这是否意味着我们通过创建一个对象(由框架创建,即使用setter/constructor注入通过xml文件实例化bean)将值注入变量 Q2 我们做DI是为了在没有对象干预的情况下工作 Q1 从中,DI模式中的所有元素都是对象。依赖对象使用接口指定它需要什么。injector对象决定哪些具体类(实例化对象)可以满足需求,并将它们提
作为一个例子,考虑一个安全服务,它可以执行<代码>编码器< /代码>的不同实现。不同的编码算法可能包括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是,类似于:)。请参阅最新编辑以了解情况。检查此链接,它提供了示例说明。当做