你还停留在使用Dagger2吗? 带你一步一步走进Dagger2的世界

Dagger2是一个依赖注入框架

1.什么是依赖注入?

就是目标类中所依赖的其他的类的初始化过程,不是通过手动编码的方式创建

将其他的类初始化好的实例自动注入到我们的目标类当中。它也是面向对象的一种设计模式,

主要作用就是降低我们程序的耦合。

讲述两个场景来描述一下Dagger2:

1.在一个对象里创建另一个对象的实例。这种行为就会产生耦合现象。导致代码难以维护。

2.Picasso / Glide框架处理图片,

如果我们的项目起初使用picasso图片框架,当运营人员更换一个素材是picasso满足不了的,需要通过Glide图片框架进行解决。这个时候需要Dagger2,

2.四种注入方式。

1.通过接口注入:

首先我们定义一个接口ClassBInterface,在接口当中我们定义一个setB方法,在方法中我们传入ClassBInterface这个参数

创建一个ClassAInterface类实现ClassBInterface这个接口,

在这个ClassAInterface这个类中定义一个ClassBInterface这个成员变量,然后复写SetB这个方法。

最后我们通过这个SetB方法完成这个接口的注入。

2.通过set方法注入

set是我们依赖注入非常重要的方法,因为依赖注入的依赖都是从外部传递过来的,特别是在java平台上,我们通过反射和动态编译来提供依赖注入的,这个时候我们set方法就会经常用到,

在ClassAset类中定义一个ClassB的成员变量,通过setClassB方法完成注入,对他的成员变量赋值,

这样就更加剥离了我们部分代码的耦合性,

3.通过构造方法来注入(最常见的)

在ClassAConstuctor中定义ClassB成员变量,通过构造方法,对成员变量进行赋值。

4.通过java注解完成依赖注入

我们添加一个@inject 这个注解 定义一个Fruit ;不管任何水果,都是通过这个注入来完成,FruitContainerInject这个类不需要关心水果类的实现了

3.Dagger2就是一个帮我写工厂的代码的工具。但是Dagger2的功能比工厂模式要强大很多。

依赖注入,不要在需要依赖的类中通过new对象来创建依赖,而是通过方法提供的参数注入进来的。

4.Dagger2的使用?

1.添加依赖

2.注解的了解:

1)@Inject :标记在需要依赖的变量上,

使用在构造函数上。

2)代码展示:

创建一个Car类,通过@Inject这个注解标注Tyre这个成员变量

在构造函数中使用注解,

这是生成的工厂类:我们关注一下这个get方法的实现:

依赖注入是依赖的对象实例转换 需要注入的实例属性。

新建工厂类的实例并调用成员变量属性注入类完成Tyre的实例注入,

但是这两者需要一个桥梁,Component;

2,@Component

这个注解可以标注接口或者抽象类。

通过这个Component这个注解可以完成依赖注入的过程,

首先我们定义一个CarComponent这个接口,添加这个@Component这个注解,

并添加一个injectCar这个方法。

当我们make这个代码之后,会生成一个DaggerCarComponent这个类:

调用我们生成的DaggerCarComponent这个类,就可以注入这个Car的属性。

5.Dagger2的inject和Compinent注解的源码分析

我们通过一个案例讲解:

我们创建一个大学类,并创建一个Student学生的成员变量。(这是老的写法)

我们看看Dagger2的写法

创建一个学生类,并设置变量id,与名称

这个时候需要Component这个桥梁,将这个两个类进行关联起来,从而达到被创建好的Student对象运送到需要他的地方,

所以我们定义一个CollegeComponent这个接口,在这个接口中定义一个inject这个方法,

最后在College这个构造方法中完成注入。

接下来我们分析的重点就在DaggerCollegeCompinent这行代码上

1.首先我们看一下这个Builder方法:

这个Builder方法返回一个new Builder();这个不难看出是通过构建者模式创建的。

接下来我们继续看,这个Build方法:

这个build完成了一个CollegeComponent方法的创建;

接下来我们点击CollegeComponent 查看做了什么?

它调用了一个initialize这个方法;

他会调用我们前面创建好的成员注入器,调用它的create方法来创建collegeMembersInjector,通过@inject注解生成的APT工具生成的代码

我们通过这个build这个方法就完成了DaggerCollegeComponent这个对象的创建,

这个时候我们调用inject()这个方法完成实际的代码注入工作:

看看他的实现:

他会调用我们前面创建好的collegeMembersInjestor的injectMembers这个方法:

我们看看这个方法是如何完成成员变量的注入的

还是一个接口 ,我们继续查看他的实现:

我们看到他调用了我们熟悉的get方法,我们继续看看他的实现:

这个就不难看出了,这是一个工厂类,这个get方法就是创建一个student对象,这样我们就走完了这个注入的流程,

其实主要就是通过三个类完成:

最终由这个工厂类完成了对象的创建。只不过dagger2给我们做了非常好的封装,

6. 这个@Inject这个注解不是万能的,存在问题

如果我们需要提供的类的构造函数无法修改怎么办?

所以Dagger2为我们提供了Module。

Module可以给不能修改源码的类提供依赖。

他需要配合Provide这个注解一起使用的

@Provide 标注一个Module中的方法

这个@Provide返回值就是我们的实例,但是这@Provide只能在module中使用,

接下来我们通过一个实例讲解:

我们创建一个CarModule类,添加Module这个依赖注解,这个provideCar在需要提供依赖的时候被调用。

然后我们将需要实例的module告诉Component,并指明modules是CarModule这个类

我们看看生成的CarModule_provideCarFactory这个类:

我们看内部实现了CarModule.provideCar(),我们点击进去看看实现:

点击进来就是我们实现的CarModule

到这里整体的源码就已经分析完了,通过一步一步分析,你是不是对Dagger2又深一步的了解更多那,如果帮助到你了,请点个赞哦!

发布了100 篇原创文章 · 获赞 376 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/wk_beicai/article/details/104070020