andorid jar/库源码解析之Dagger/Dagger2
dagger、dagger2:
作用:
1、用于解耦activity和业务逻辑
2、在使用业务的时候,不需要重复编写new代码。
3、当业务变化的时候,不需要对所有的ui,进行修改。
4、便于测试,和正式,替换指定module即可。
栗子:
需要:
1、定义 commoncomponent 的接口 标记 @component(modules = xxxmodule.class) 的注解
2、定义xxxmodule 模块,并标注 @module 的注解 ,对添加的方法使用 provide开头,这些 provide方法需要添加 @provides注解
a业务类:
构造函数使用 @inject 注解
b页面:
1、定义a业务类的变量,使用@inject注解
2、在oncreate中,使用如下代码进行初始调用
daggercommoncomponent.builder().commonmodule(new commonmodule(this)).build().inject(this);
3、daggercommoncomponent由,使用dagger自动生成的类(dagger使用apt技术实现),使用apt生成如下代码
4、然后就可以使用了。。。。
源码解读:
①:创建一个 daggercommoncomponent$builder对象,用于接收 commonmodule 和返回 commoncomponent的接口对象
②:创建一个 commonmodule对象,参数是当前对象,并且赋值commonmodule对象给 daggercommoncomponent$builder对象的成员
③:检查 commonmodule对象,并且返回一个 daggercommoncomponent对象。且该对象创建了一个prodiver对象。且赋值为 新增类 commonmodule_provideicommonviewfactory 继承于factory(factory extends provider),且包含成员commonmodule
④:调用daggercommoncomponent对象的inject并传入当前对象,创建一个 loginpresenter 对象,并且赋值给this对象的presenter对象(该对象标记过inject)
引入:
// dagger2 implementation 'com.google.dagger:dagger:2.23.1' annotationprocessor 'com.google.dagger:dagger-compiler:2.23.1'