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生成如下代码
编译之后查看APK是下面这样(红色部分为自动生成)
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)
源码:https://github.com/square/dagger (Dagger) https://github.com/google/dagger (Dagger2)
引入:
// dagger2 implementation 'com.google.dagger:dagger:2.23.1' annotationProcessor 'com.google.dagger:dagger-compiler:2.23.1'