依赖注入指的就是类A依赖于类B,通过外部注入的方式来实现,而不是通过自身去实现。
这样做的好处就是可以使得代码之间更加的解耦。
举个例子,船(ship)包含有船桨(oar),以下为高耦合的写法,
public class Oar { //船桨public Oar(){ } }
public class Ship {private Oar oar;//船桨public Ship(){oar = new Oar();//在类中自己实现船桨}}
这样写的坏处就是,ship和oar耦合度太高,将来如果oar发生变化,比如需要指定oar的长度
public class Oar { int length;public Oar(int length){ this.length = length;} }
那么ship的代码也需要进行修改
public class Ship {private Oar oar;public Ship(int length){//指定船桨的长度oar = new Oar(length);}}
使用依赖注入的方法对上面的代码进行修改,通常有3中方法,
1.构造函数传递依赖
public class Ship {private Oar oar;public Ship(Oar oar){this.oar = oar;//构造函数传递}}
2.Setter函数传递
public class Ship {private Oar oar;public Ship(){}public void setOar(Oar oar){//setter函数传递this.oar = oar;}}
3.接口声明传递
将船和船桨抽象成一个接口
public interface OarI {//浆接口}
public interface ShipI {//船接口public void setOar(OarI oar);//接口依赖传递}
船和浆分别继承接口
public class Oar implements OarI{public Oar(){}}
public class Ship implements ShipI{private OarI oar;public Ship(){}@Overridepublic void setOar(OarI oar) {this.oar = oar;}}
经过修改之后船和船桨更加解耦,特别是第三种接口传递依赖,当需求发生变化时,修改的地方会比较少,结构也很清晰。