最近打算面试,又把 Dagger2 源码稍微看了下。
# 1. 依赖注入
简单的说就是一个类依赖了另一个类,A 持有 B 的实例,这样 B 的以来就注入了 A
##### 四种依赖注入的方式:实现接口,set () 方法,构造方法初始化以及注解方式
# 2. 注解方式注入
目标类中所依赖的其他类的初始化过程不是通过编码的方式来实现的,而是通过方法提供的参数注入来实现的
# 3.@Inject
使用场景有两种,一种是标记在需要依赖的变量,另一种是使用在构造方法上
编译的时候会生成 menmbersInjector 类,并且 @Inject 注解的成员变量不能是 private 修饰的

加入被 private 修饰的话,会无法获取该成员变量
修饰构造方法时

会自动生成工厂类

# 4.@Component
作为注入的桥梁,可以标注接口或者抽象类,可以完成依赖注入的过程

在 make project 后会生成 DaggerXXXComponent 类
在注入的类中调用 DaggerXXXComponent 的 builder.build () 方法实例化该类,在 DaggerXXXComponent 构造方法中有 initiallize () 方法
初始化当前的 injector, 通过自动生成的 membersInjector 的 create 方法传入自动生成的工厂类就可以实例化当前的 injector

最厚实 inject () 方法

最终还是调用了工厂类的 get () 方法拿到了当前需要注入的对象.
# @Module
通过 @inject 修饰构造方法来注入当前的实例是有前提的,那就是当前的类是可修改的,一旦我们碰到 jar 包中的类需要注入的时候我们就需
要用到 @module 注解了在 module 中通过 @Provide 修饰的方法来提供我们需要注入的实例,该方法的命名要以 provide 开始,并且返回值一定是我们要注入的实例

此时就需要在 component 上致命我们的 module 对象了

同样会生成工厂类,但是是通过 module 的 provide 方法来获得实例

不同于先前的构造方法 inject 注解,这次在 DaggerXXXComponent 类中会生成 privide 的实例对象同样会吧实例通过我们自己写的 provide 方法
传入,最终调用 inject () 方法的时候就能通过 membersInjector 的 injectMenbers () 方法将当前实例赋值给我们注解的成员变量;