一、控制反转 — Inversion of Control

我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。

对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。

如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson提出了IoC理论,用来实现对象之间的“解耦”。

IoC 体现了好莱坞原则,即“不要打电话过来,我们会打给你”。

所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。

其主要实现方式有两种:

关键是,调用者需要的另一个对象实例不在调用者内部实现,而是通过一定的方式从外部传入实例,从而解决了各个类之间的耦合。

二、Dagger

三、Dagger2的四个基本概念

@Inject

用于构造一个这个类的实例并满足他们的依赖

@Module

Module标注的类是专门用来提供依赖的,作为实例对象的容器,无法修改的第三方Jar

@Provide

modules中使用,标注能够提供实例化对象的方法

@Component

@Inject@Module的桥梁,它的主要作用就是连接这两个部分

四、更多概念

上面把四个简单的注解的用法都讲完了,但很多时候这几个注解并不能涵盖我们所有的场景,比如我们的类有多个构造方法,比如我们需要管理生命周期

@Qulifier

当我们的类有多个构造方法,前面的@Provide就会蒙蔽了,于是需要Qulifier来解决,通过自定义Qulifier,可以去查找具体的依赖提供者

@Scope & @Singleton

Scope提供局部单例的功能,所谓局部,就是在一定的生命周期内,比如ApplicationActivitySingletonScope的一个实例,我们可以通过Scope创建属于自己的异域理解局部单例

Lazy

通过申明,注入Lazy变量,实现懒加载,即在需要的时候才创建