Dagger2的使用方法

167 阅读3分钟

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框架的意义

依赖注入是很重要的一点

另外一点就是注解是元数据,是用来## 配置依赖关系 ##的,这是我们使用的时候要时刻记住的一点