dagger2学习
1.是什么
依赖注入框架
基础
六大设计原则之依赖导致
依赖导致和依赖注入的关系
依赖注入的实现方法
2.怎么用
配置依赖
implementation 'com.google.dagger:dagger-android:2.19'
implementation 'com.google.dagger:dagger-android-support:2.19' // if you use the support libraries
implementation 'com.google.dagger:dagger:2.19'
annotationProcessor 'com.google.dagger:dagger-compiler:2.19'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.19'
代码编写,以MVP架构为例
定义4个类 ShowPresenter ShowActivity ShowModule ShowComponent
第一步 借鸡生蛋
在ShowActivity中添加Activity并依赖ShowPresenter
@Inject
ShowPresenter mPresenter;
此时使用make project编译得到一个 ShowActivity_MembersInjector的java文件 顾明思议是个注射器,提供了将ShowPresenter的实例注册到ShowActivity的方法,如下
@Override
public void injectMembers(ShowActivity instance) {
injectMPresenter(instance, mPresenterProvider.get());
}
public static void injectMPresenter(ShowActivity instance, ShowPresenter mPresenter) {
instance.mPresenter = mPresenter;
}
第二步 无中生有
通过第一步得到了一个注射器,可以将ShowPresenter的实例注册到ShowActivity中, 此时我们通过注解@Inject配置ShowPresenter的构造方法来实现dagger框架 对于ShowPresenter这个实例的创建,代码如下:
@Inject
public ShowPresenter(){}
再次通过make project编译,可以看到生成了另外一个文件ShowPresenter_Factory 显然,这是一个工厂类,这个工厂类的核心是提供了一个产生ShowPresenter实例的方法,如下代码
@Override
public ShowPresenter get() {
return provideInstance();
}
public static ShowPresenter provideInstance() {
return new ShowPresenter();
}
这个ShowPresent_Factory实现了Factory接口,而Factory接口又继承自Provider,如下
public final class ShowPresenter_Factory implements Factory<ShowPresenter>
public interface Factory<T> extends Provider<T> {}
public interface Provider<T> {
T get();
}
至此,通过第一步生成了一个注入器类,可以把Presenter注入到Activity中,通过第二步生成了一个可以创建Presenter的工厂类 但是注入器类和工厂类并没有关联起来,思考下注入的时机是什么,我们自己写代码的时候怎么写的?
第三步 你侬我侬
通过关键注解 @Component 来解决注入类和工厂类的关联问题
定义一个ShowComponet类
@Component
public interface ShowComponent {
void inject(ShowActivity showActivity);
}
同样编译之后得到 DaggerShowComponent
public final class DaggerShowComponent implements ShowComponent
@Override
public void inject(ShowActivity showActivity) {
injectShowActivity(showActivity);
}
private ShowActivity injectShowActivity(ShowActivity instance) {
ShowActivity_MembersInjector.injectMPresenter(instance, new ShowPresenter());
return instance;
}
可以看到关键方法-----对于ShowComponent中定义的抽象方法inject的实现
通过在ShowActivity中调用DaggerShowComponent.create().inject(this) 将这些类串联其阿里 DaggerShowComponent 就像一座桥梁,将activity和presenter的关系建立起来
此时提出一个问题,如果需要注入的类存在于三方的jar包中而不能修改,如何建立起联系呢???
由于无法通过@inject的方式来配置Gson构造方法 进而实现依赖关系,此时就需要用到注解@Module和@Provider 来配置依赖注入的关系了
如ShowActiviy中同时依赖于Gson
@Inject
ShowPresenter mPresenter;
@Inject
Gson mGson;
ShowModule 代码如下
@Module
public class ShowModule {
@Provides
public Gson providerGson(){
return new Gson();
}
@Provides
public ShowPresenter providerShowPresenter(){
return new ShowPresenter();
}
}
修改ShowComponent依赖
@Component(modules = ShowModule.class)
public interface ShowComponent {
void inject(ShowActivity showActivity);
}
编译---- Gson是三方aar包中的类,不能通过Inject来配置依赖关系,但是通过Module可以实现 编译生成ShowModule_ProviderGsonFactory 和ShowPresent_Factory类似,提供了一个Gson的实例,通过MembersInjectors将实例注入到activity中
@Override
public void injectMembers(ShowActivity instance) {
injectMPresenter(instance, mPresenterProvider.get());
injectMGson(instance, mGsonProvider.get());
}
3.干什么
4.总结
理解了注解的作用,才能更好的明白dagger2框架的意义
依赖注入是很重要的一点
另外一点就是注解是元数据,是用来## 配置依赖关系 ##的,这是我们使用的时候要时刻记住的一点