Dagger2 是有门槛的,这样不同水平能力的开发者去学习这一块的时候,感受到的压力是不一样的。
我个人总结了大家在学习 Dagger2 时,为什么感觉难于理解的一些原因。
- 对于 Java 注解内容不熟悉。
- 对于依赖注入手段不熟悉。
- 对于 Java 反射不熟悉。
- 对于 Dagger2 与其它开源库的使用方法的不同之处,没有一个感性的认知。
- 对于 Dagger2 中极个别的概念理解不够。
- 对于 Dagger2 的用途与意义心生迷惑。
其实以上几点,都可以归类到基础技能不扎实这个范畴内,但正如我所说的,学习 Dagger2 时开发者的水平是不一样的,所以困扰他们的原因就不一样。下面,我针对这些情况,一一给出自己的建议。
对于 Java 注解不熟悉
这一部分的开发者基础知识确实薄弱,那么怎么办呢然是学习了。就算不为 Dagger2,注解的知识内容也应该好好值得学习,虽然在平常开发中,我们自己编写注解的机会很少,但是我们运用第三方开源库的时候,应该会经常看见注解的身影,所以熟悉注解不是为了自己编写注解代码,而是为了开发过程中更加高效从容而已。
如果,对 Java 注解一无所知,我可以给大家一个感性的认知。
一般,我们评价某人会说,这是一个好人、坏人、男神、女神、大神、单身狗等等,这是我们人为贴得标签,这些标签有助于我们自己或者其他人去获取被评价的人的基本信息。
而在 Java 软件开发中,我们也可以给某些类,某些字段贴上作用类似的标签,这种标签的名字就叫做注解,只不过这种标签是给代码看的。
C 变动的时候,由于 A 依赖于它,A 不得不修改自己的代码。但是,事情还没有完。C 还会变动,C 把 B 也带坏了节奏。
可以想像的是,只要 B 或者 C 变动一次,A 就可能需要修改自己的代码,用专业术语描绘就是A 与依赖模块太过于耦合,这个可是犯了软件设计的大罪,
我们再可以想像一下,A 是领导,B 和 C 是小兵,如果因为 B 和 C 自身的原因,导致领导 A 一次次地改变自己,那么以现在流行的话来说就是,“你良心不会痛吗。所以我们需要的就是进行一些变化来进行解耦,也就是解除这种耦合的关系。让 A 不再关心 B 和 C 的变化,而只要关心自身就好了。
在上面代码中,A 不再直接创建 B 与 C,它把依赖的实例的权力移交到了外部,所以无论 B 和 C 怎么变化,都不再影响 A 了。这种实例化依赖的权力移交模式被称为控制反转(IoC),而这种通过将依赖从构造方法中传入的手段就是被传的神乎其乎的依赖注入(DI)。其实,本质上也没有什么神奇的地方,只是起了一个高大上的名字而已,好比东北的马丽,在国际化上的大舞台,宣称自己是来自神秘东方的 Marry 一样。
依赖注入有 3 种表现形式。
构造方法注入
Setter 注入
接口注入
大家肯定会想,依赖注入的引进,使得需求方不需要实例化依赖,但总得有地方去实例化这些依赖啊。确实,依赖注入引进了第三方,你可以称它为 IoC 容器,也可以称它为注射器(injector),为了便于理解,我们之后都有注射器来指代吧,通过注射器可以将依赖以上面 3 种注入方式之一注入到需求方。
刀、枪、棍、棒是武器,盔甲是装备。
武器拿来就用,盔甲等却要在开始战斗前就装备上。
Java 软件代码是在虚拟机中运行的,所以在这里可以把 jvm 当作战场。
Piccso、Logger、sweet-alert-dialog 等等,这些开源库都是在程序运行过程中拿来就用的。
而 GreenDao、Butterknife、Dagger2 这些因为涉及到了反射处理,而反射处理相对于正常开发速度很慢,所以它们通常在编译时产生一些新的代码,然后才能在程序运行过程中使用,也就是说它们都把反射处理移动到编译器编译代码时的阶段,而程序运行时并不涉及到反射,这就是这些框架运用了反射技术,但是仍然高效的秘诀所在。
所以,Dagger2 会产生中间代码,不少同学应该会有迷惑,为什么引进了 Dagger2 时,要先编译一次代码,不然就会 错。现在,可以解释了,编译代码是为了生成中间代码,然后在中间代码的基础上按照正常的流程开发。
Dagger2 并非横空出世
都说要站在巨人的肩膀上,Dagger2 其实也算站在巨人的肩膀上。
Dagger2 是一款依赖注入的框架,但依赖注入的框架有 ,所以 Dagger2 也并不算是一款新鲜事物,大家觉得新奇不过是因为对于依赖注入框架本身了解过少罢了。
Dagger2 是在 Dagger 的基础上来的,Dagger 是由 Square 公司开发的,Dagger2 基于 Dagger 由 Google 公司开发并维护。
Square 是一家伟大的公司,Android 大神 JakeWoton 之前就在它任职,不久前才离职。而我们熟悉的 RxJava、Butterknife、Retrofit、OKHttp 等等都是 Square 提供的,外 Square 全家桶。
JSR330 是规范,建议大家怎么做,而 Dagger2 则实现了这个规范。
因此,对于普通开发者而言,学习 Dagger2 其实就是学习相关的注解的意义与用途。
Dagger2 的引进
Dagger2 是适应于 Java 和 Android 开发的依赖注入框架,记住得是它不仅仅对 Android 开发有效。
Dagger2 官 地址是 https://google.github.io/dagger//
对于 Eclipse 开发而言,需要下载相应的 jar 包。
对于 AndroidStudio 开发而言,只需要在相应的 build.gradle 引入对应的依赖就好了。
如果你 AndroidStudio 的 gradle build tool 版本在 2.2 以上,直接在引进就好了
如果你的 gradle build tool 版本在 2.2 以下,则需要引进 apt 插件。
首先需要在 Project 层级的 build.gradle 文件中引入依赖
然后在 Module 层级的 build.gradle 引入相应的插件和依赖
Dagger2 的基本概念
前面讲到过 Dagger2 基于 JSR330 注解,在普通开发者视角中,就是这些注解构成了 Dagger2 的全部。
前面文章我提到过,注解如同标签,给一个人贴标签有助于自己去理解这个人,而给代码贴标签,有助于 APT 程序去处理相应的代码,Dagger2 有自己的注解,而这些注解也有特定的意义,它们大体上都是为了实现依赖注入。
我们说依赖注入有 3 种手段:
– 构造方法注入
– Setter 注入
– 接口注入
但是,如果不借助于框架的话,我们就必须自己编写相应的代码,这些代码充当了注射器的角色。
A 将内部的依赖 B 和 C 的实例化的权力移交到了外部,通过外部的注入。
Dagger2 这类依赖注入框架的出现进一步解放了我们的双手,Dagger2 有一套自己的依赖注入机制,我们不再手动编写注射器,而只要按照规则配置好相应的代码就好了,Dagger2 会自动帮我们生成注射器,然后在适当的时候进行依赖注入。
什么意思呢思就是我们不需要调用 a.setB() 和 a.setC() 方法,只需对代码添加一些注解就好了。
看起来,不可思议,不是吗Inject 是一个注解,只要按照 Dagger2 的配置,就能颠覆我们之前的编码习惯。
但不管看起来怎么神奇,任何事都有一个本质。
因此这个本质就是,Dagger2 是一个依赖注入框架,依赖注入的目的就是为了给需求方在合适的时候注入依赖。
对 Dagger2 学习过程如果感到不适与难以理解,回过头来想想它的本质好了。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!