Dagger2 Android库的使用笔记
附上官方文档 ,内有最基本的使用教程,请先阅读此文档在来食用此笔记效果更佳
1.注入Application
- 创建ApplicationComponent
- Application实现相关注射器接口(DispatchingAndroidInjector)
1.1创建ApplicationComponent
创建一个Component继承
AndroidInjector<MyApplication>
这样就能自动生成注入Application的方法,以及注入其他组件的注入器的生成方法public interface ApplicationComponent extends AndroidInjector<MyApplication>
在该 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(); }
给该 Component添加Module
- 添加AndroidInjectionModule,这是构建IOC结构的实现部分
- 添加 绑定组件和注入器关系的Module(暂命名为BindingModule)
- 添加该 Component自用的Module(没有的话就略过此步骤)
@Component(modules = {AndroidInjectionModule.class, BindingModule.class, OtherModule.class})
步骤1和步骤3太easy了就不介绍了
步骤2:BindingModule的实现方式有两种自定义组件的Component
@Module(subcomponents = MainComponent.class) public abstract class BindingModule{ @Binds @IntoMap @ActivityKey(MainActivity.class) abstract AndroidInjector.Factory<? extends Activity> bindYourActivityInjectorFactory(MainComponent.Builder builder); }
用注解自动生成组建的Component
@Module public abstract class ActivityBindingModule { @ActivityScoped //这个Scope注解可以没有 @ContributesAndroidInjector(modules = MainModule.class) abstract MainActivity mainActivity(); }
这一步骤的作用有两个:
1.创建组件和注入器工厂(AndroidInjector.Factory)的映射关系;
2.将组件的Component设为ApplicationComponent的subcomponent看过官方文档的童鞋应该发现,文档中的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);
}
至此就大功告成了,其他组件的注入大同小异,参考其他文档哈