Dagger2 Android库的使用笔记

Dagger2 Android库的使用笔记

附上官方文档 ,内有最基本的使用教程,请先阅读此文档在来食用此笔记效果更佳

1.注入Application

  1. 创建ApplicationComponent
  2. Application实现相关注射器接口(DispatchingAndroidInjector
1.1创建ApplicationComponent
  1. 创建一个Component继承AndroidInjector<MyApplication>
    这样就能自动生成注入Application的方法,以及注入其他组件的注入器的生成方法

        public interface ApplicationComponent extends AndroidInjector<MyApplication> 
  2. 在该 Component内创建Builder,需要提供注入Application的方法,也可直接继承AndroidInjector.Builder<MyApplication>

    @Component.Builder
    abstract class Builder extends AndroidInjector.Builder<MyApplication> {
    }

    或者

    @Component.Builder
    interface Builder {
    
        @BindsInstance
        AppComponent.Builder application(Application application);
    
        AppComponent build();
    }
  3. 给该 Component添加Module

    1. 添加AndroidInjectionModule,这是构建IOC结构的实现部分
    2. 添加 绑定组件注入器关系的Module(暂命名为BindingModule
    3. 添加该 Component自用的Module(没有的话就略过此步骤)
    @Component(modules = {AndroidInjectionModule.class, BindingModule.class, OtherModule.class})

    步骤1和步骤3太easy了就不介绍了
    步骤2:BindingModule的实现方式有两种

    1. 自定义组件的Component

      @Module(subcomponents = MainComponent.class)
      public abstract class BindingModule{
      @Binds
      @IntoMap
      @ActivityKey(MainActivity.class)
      abstract AndroidInjector.Factory<? extends Activity> bindYourActivityInjectorFactory(MainComponent.Builder builder);
      }
    2. 用注解自动生成组建的Component

      @Module
      public abstract class ActivityBindingModule {
      @ActivityScoped //这个Scope注解可以没有
      @ContributesAndroidInjector(modules = MainModule.class)
      abstract MainActivity mainActivity();
      }

    这一步骤的作用有两个:
    1.创建组件注入器工厂AndroidInjector.Factory)的映射关系;
    2.将组件的Component设为ApplicationComponentsubcomponent

    看过官方文档的童鞋应该发现,文档中的BindingModule其实是放在了原本该由组件所依赖的Module(例如MainModule)中实现,并把该Module依赖给ApplicationComponent而不是组件的Component,然后由于组件的Component(例如MainComponent)是ApplicationComponent的subcomponent,因此也可以调用ApplicationComponent的Module方法。
    这样做也是一种方式,但是这样的话ApplicationComponent就必须是unscoped的,不然无法引用带有Scope注解的其他Module方法了

1.2 Application实现相关注射器接口

有两种方式:
1.继承DaggerApplication

public class MyApplication extends DaggerApplication {

    @Override
    protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
        return DaggerAppComponent.builder().application(this).build();
    }


}

2.实现HasActivityInjector 之类的接口

public class MyApplication extends Application implements HasActivityInjector{
    @Inject
    DispatchingAndroidInjector<Activity> dispatchingAndroidInjector;
    @Override
    public void onCreate() {
        super.onCreate();
        //给Application的成员变量注入值,由Dagger实现具体的实例对象
        DaggerApplicationComponent.builder().create(this).inject(this);
    }

    @Override
    public AndroidInjector<Activity> activityInjector() {
        return dispatchingAndroidInjector;
    }
}

2.创建组件注入关系

根据BindingModule的两种实现方式,也有两种对应的注入方式

  • 采用自定义组件的Component
  • 用注解自动生成组建的Component
2.1采用自定义组件的Component
  • 创建Module
@Module
public abstract class MainModule {
    @ActivityScope
    @Provides
    public static MyInfo provideMyInfo() {
        return new MyInfo(1, "Michael");
    }


}
  • 创建Component
@ActivityScope
@Subcomponent(modules = MainModule.class)
public interface MainComponent extends AndroidInjector<MainActivity> {
    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<MainActivity> {

    }
}
  • 别忘了在BindingModule里加入subcomponent 和 对应的 方法(详见上文Application部分)
2.2用注解自动生成组建的Component
  • 只需要创建Module即可,因为在BindingModule中已经绑定了对应的关系

3.注入组件

只需要在组件的onCreate方法里加入AndroidInjection.inject(this);
注意 要在super.onCreate(savedInstanceState);前面

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        AndroidInjection.inject(this);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sec);

    }

至此就大功告成了,其他组件的注入大同小异,参考其他文档哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值