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又深一步的了解更多那,如果帮助到你了,请点个赞哦!