最近打算面试,又把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()方法将当前实例赋值给我们注解的成员变量;

Last modification:March 26th, 2019 at 07:07 pm
If you think my article is useful to you, please feel free to appreciate