一些概念的解释
什么是依赖注入
首先提一个问题:两个或者更多的类之间是怎么实现相互协作,或者说,一个类是如何与另外一个类产生关系或者管理与自己相互协作的对象(也就是另外一个类的)引用?
通过new操作
public interface Class {
void say();
}
public class ClassA implements Class{
private int a;
public void say(){
System.out.println("Hello!!");
}
}
public class ClassC implements Class{
private int c;
public void say(){
System.out.println("Hello!! I am ClassC");
}
}
public class ClassB{
private ClassA a;
public ClassB(){
//在这一步通过new操作将ClassA与ClassB关联起来
this.a = new ClassA();
}
public void makeClassSayHello(){
a.say();
}
}
这使得ClassA紧密地和ClassB耦合到了一起,因此极大地限制了这个ClassB的能力。如果需要ClassB做其他的事,比如不想让ClassA说话,想让ClassC说话的话,那就没办法了。(真惨…)
耦合具有两面性(two-headed beast)。一方面,紧密耦合的代码难以测试、难以复用、难以理解,并且典型地表现出“打地鼠”式的bug特 性(修复一个bug,将会出现一个或者更多新的bug)。另一方面,一定程度的耦合又是必须的——完全没有耦合的代码什么也做不了。为 了完成有实际意义的功能,不同的类必须以适当的方式进行交互。总而言之,耦合是必须的,但应当被小心谨慎地管理。——《Spring实战》
为了能让ClassB调用(指派)其他Class的动作,需要第三方组件的帮助了啦——Spring依赖注入
如何可以简单的实现“ 将所依赖的关系自动交给目标对象,而不是让对象自己去获取依赖 ”?
依赖注入的简单实现第一种方法:构造器注入
通过构造器注入方法(constructor injection)
public interface Class {
void say();
}
public class ClassA implements Class{
private int a;
public void say(){
System.out.println("Hello!!");
}
}
public class ClassC implements Class{
private int c;
public void say(){
System.out.println("Hello!! I am ClassC");
}
}
public class ClassB{
private Class class;//这里使用接口定义
//使用带参构造器
public ClassB(Class class){
this.class = class;
}
public void makeClassSayHello(){
class.say();
}
}
依赖注入的简单实现第二种方法:setter设置
通过setter注入方法
public interface Class {
void say();
}
public class ClassA implements Class{
private int a;
public void say(){
System.out.println("Hello!!");
}
}
public class ClassC implements Class{
private int c;
public void say(){
System.out.println("Hello!! I am ClassC");
}
}
public class ClassB{
private Class class;//这里使用接口定义
//使用setter方法
public void setClass(Class class){
this.class = class;
}
public void makeClassSayHello(){
class.say();
}
}
通过依赖注入可以:
1.无需自行创建对象(不用new操作)
2.在构造对象时将class作为构造器参数传入,交由编译器决定。只要是实现了class的接口的都可以作为被传入的参数,实现解耦合、使得拥有不同的具体实现。(构造器注入)
3.将已经实现Class接口并且存在(实例化) 的class对象作为参数设置为ClassB的属性也可以实现解耦,实现同样结果。(setter方法)