dagger2-android,dagger2从入门到放弃-dagger.android

上一章中介绍了Activities Subcomponents Multibinding的实现过程,但是多出那么多步骤还是让人有些头晕;而使用dagger.android可以简化这一过程

使用

step1

需要引入"com.google.dagger:dagger-android:${dagger_version}"

如果需要注入SupportLib中的Fragment还需要引入"com.google.dagger:dagger-android-support:${dagger_version}"

引入注解处理器"com.google.dagger:dagger-android-processor:${dagger_version}"

step2

定义一个抽象的Module类,在里面定义一个返回对应Activity使用@ContributesAndroidInjector的抽象方法

dagger.android会根据@ContributesAndroidInjector生成需要注入对应对象的SubComponent,并添加到map中

@Module

public abstract class ActivitysModule {

@ActivityScope//指定Subcomponent的生命周期

@ContributesAndroidInjector(modules = DaggerAndroidActivityModule.class)//指定DaggerAndroidActivity的Subcomponent中需要安装的Module

abstract DaggerAndroidActivity bindDaggerAndroidActivity();

}

这一步相当于完成了上篇文章中的step2、3、4、5,最终dagger.android会生成需要添加到map中的SubComponet.Builder

step3

将包含@ContributesAndroidInjector注解方法的Module和dagger.android提供的Module安装到AppComponent中

@Component(modules = { AndroidInjectionModule.class,

AndroidSupportInjectionModule.class,

ActivitysModule.class,...})

public interface AppComponent {

void inject(RealApplication application);

}

step4

在Application中实现HasActivityInjector接口

public class RealApplication extends BaseApplication implements HasActivityInjector {

@Inject

DispatchingAndroidInjector activityInjector;

@Override

public void onCreate() {

super.onCreate();

DaggerAppComponent.builder()

.baseAppModule(new BaseAppModule(this))

.build().inject(this);

}

@Override

public AndroidInjector activityInjector() {

return activityInjector;

}

}

dagger.android还可以支持其他三大组件以及Fragment的注入,具体可以查看DaggerApplication的源码

step5

在activity中完成注入

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

AndroidInjection.inject(this);

}

原理解析

看看AndroidInjection.inject(this)到底干了啥

public static void inject(Activity activity) {

checkNotNull(activity, "activity");

Application application = activity.getApplication();

if (!(application instanceof HasActivityInjector)) {

throw new RuntimeException(

String.format(

"%s does not implement %s",

application.getClass().getCanonicalName(),

HasActivityInjector.class.getCanonicalName()));

}

//因为application实现了HasActivityInjector,所以可以得到一个

AndroidInjector activityInjector =

((HasActivityInjector) application).activityInjector();

checkNotNull(activityInjector, "%s.activityInjector() returned null", application.getClass());

activityInjector.inject(activity);

}

application中被注入的是DispatchingAndroidInjector

其中持有了Map, Provider>> injectorFactories;相当于SubComponent.Builder的map,

DispatchingAndroidInjector实现了 AndroidInjector,这里的inject(T instance);是通过获取AndroidInjector.Factory构造可直接注入的AndroidInjector间接完成的注入

public interface AndroidInjector {

void inject(T instance);

interface Factory {

AndroidInjector create(T instance);

}

abstract class Builder implements AndroidInjector.Factory {

@Override

public final AndroidInjector create(T instance) {

seedInstance(instance);

return build();

}

@BindsInstance

public abstract void seedInstance(T instance);

public abstract AndroidInjector build();

}

}

AndroidInjector就比较好理解了,它其实就是一个SubComponent的下层接口,而AndroidInjector.Factory就是它的Builder

优点

大大简化了Multibindings的实现过程

缺点

因为Multibindings的整个原理是面向抽象的,所以基于Multibindings的dagger.android也无法使用AndroidInjector.Factory提供其他的参数作为依赖的基础

dagger.android只支持四大组件和Fragment,对于ViewModel这种对于Multibindings有强烈需求的对象还不支持(立个flag,有官方支持应该也快了)

相关文章

示例代码

DaggerInAction

欢迎star

master分支上最新的代码可能会比当前文章的示例代码稍微复杂点,提交记录里包含了每一步的迭代过程,可以顺藤摸瓜

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值