2.1 依赖
如果在 ClassA中,有 ClassB 的实例,则称 ClassA对 ClassB 有一个依赖。
2.2 依赖注入
依赖注入就是非自己主动初始化依赖,而通过外部来传入依赖的方式,简单来说就是不使用 new 来创建依赖对象。
如:客户类Client(依赖概念中的ClassA)不用自己来初始化它所依赖的成员变量IServer(依赖概念中的ClassB),而是等待某个对象创建IServer的适当的(实现类)的对象并将它赋值给Client的成员变量。
依赖注入框架主要用于模块间解耦,Client仅仅与(通常是接口或抽象类)IServer耦合,而不与IServer的子类型耦合,提高代码的健壮性和可维护性。
2.2.1 依赖注入的基本原则
应用组件不应该负责查找资源或者其他依赖的协作对象。配置对象的工作应该由IoC容器负责,“查找资源”的逻辑应该从应用组件的代码中抽取出来,交给IoC容器负责。
2.2.2 依赖注入的方式
站在Client的角度,Client接受注入有3种的方式。
a) 构造器注入(Constructor Injection)
客户类Client提供了public的构造器Client(IServer s),等待外界创建IServer的(实现类的)对象后将其引用传递进来/注入。
public Client(IServer s){
this.s=s;
}
b) 属性(设置)注入
Setter注入(Setter Injection)时,客户类Client提供setIServer (IServers),等待外界创建IServer的(实现类的)对象后将其引用传递进来/注入。public void setIServer (IServer s){
this.s=s;
}
c) 接口注入
接口注入相当于将Setter注入的setIServer (IServer s) 方法封装到一个专用的接口如InjectIServer中,而Client实现InjectIServer并给出如下的方法体。@Override public void setIServer (IServer s){
this.s=s;
}
//
//接口注入针对的场景是,有大量Client、Client1等都需要依赖于IServer。
public interface InjectIServer{
public void setIServer (IServer s);
}