什么是Dagger
Dagger是为Android和Java平台提供的一个完全静态的,在编译时进行依赖注入的框架,原来是由Square公司维护,现在由Google维护。
什么是依赖注入
提到依赖注入,那就会提到另外一个词控制反转。
在Stack Overflow上面有一个问题,如何向一个5岁的小孩解释依赖注入,其中得分最高的一个答案是:
当你自己去冰箱里取东西,你可能会导致一些问题。你可能让冰箱门开着,你可能会取一些妈妈或爸爸不希望你拿的东西。你甚至可能会寻找一些冰箱里没有或已过期的东西。你应该要做的只是提出需求,“午餐时我需要一些喝的东西”,然后我们确保当你坐下来时有吃的东西。
这个原理简单归结如下:
- 高层次模块不应该依赖低层次模块,他们应该依赖于一种抽象。
- 这种抽象不应该依赖细节,细节应该依赖于抽象
依赖倒置解决了高层次模块依赖于低层次模块和其细节的问题。
Dependency injection 是一个将行为从依赖中分离的技术,简单地说,它允许开发者定义一个方法函数依赖于外部其他各种交互,而不需要编码如何获得这些外部交互的实例。 这样就在各种组件之间解耦,从而获得干净的代码,相比依赖的硬编码, 一个组件只有在运行时才调用其所需要的其他组件,因此在代码运行时,通过特定的框架或容器,将其所需要的其他依赖组件进行注入,主动推入。
依赖注入可以看成是 反转控制 inversion of control 的一个特例。反转的是依赖,而不是其他,JNDI也是一种反转控制,它反转的JNDI名称或资源。参考: “Inversion of Control Containers and the Dependency Injection pattern”。
依赖注入是最早Spring和piconcontainer等提出,如今已经是一个缺省主流模式,并扩展到前端如Angular.js。本主题国内最早IOC和依赖注入的讨论专题。
依赖注入与IOC模式类似工厂模式,是一种解决调用者和被调用者依赖耦合关系的模式,自2004年诞生以来,至今已经成为Java和其他领域的主流模式。它解决了对象之间的依赖关系,使得对象只依赖IOC/DI容器,不再直接相互依赖,实现松耦合,然后在对象创建时,由IOC/DI容器将其依赖的对象注入Inject其体内,故又称依赖注入依赖注射模式,最大程度实现松耦合,特别是Autowiring/Autowired自动配对引入,再结合Java的垃圾回收机制,使得在Java中,对象不再需要开发者自己创建,也需要开发者自己销毁,只需要直接使用即可,大大提升了开发效率。
详细解释:依赖注入说白一点,就是容器将某个类依赖的其他类注入到这个类中。
那么什么是依赖?如下代码表示A依赖B,因为Ad的方法行为mymehtod有一部分要依赖B的方法m实现,如同小孩在某些行为要依赖父母帮助完成一样,父母亲经常在小孩需要做什么事情时,主要帮助其做好,把他需要的结果直接给他,这也是一种依赖注入,(长此以往,小孩的独立性会丧失):
public class A{
private B b;
public A(B b){
this.b = b;
}
public void myMethod(){
b.m();
}
}
在通常情况下,我们是在使用A时同时需要将B的实例赋予A。
A a = new A(new B());
a. mymethod();
而通过依赖注入容器或框架,A对B的依赖无需我们编写代码时赋予,只要我们从一个工厂或容器中获取A的实例,这个工厂或容器是依赖注入框架提供的,它会在里面偷偷地将B的实例注入到A中:
A a = factory.getA();
a. myMethod();
这样,我们客户端调用代码就只和A耦合,这样,我们无需打开A的代码,观察其内部和哪些其他类发生依赖耦合,然后手工将这些依赖的实例注入其中。
-----待续