本文针对的是dagger-2.22.1的简单使用
一、Dagger2使用
1. gradle引入dagger2依赖
implementation 'com.google.dagger:dagger:2.22.1'
annotationProcessor 'com.google.dagger:dagger-compiler:2.22.1'
2. 定义可以被注入的实体类
@Singleton
public class ClassA {
@Inject
public ClassA() { //... }
}
3. 定义需要注入的类
public class ClassB {
@Inject ClassA a;
}
4. 定义需要注入的类与被注入类之间的接口
@Singleton
@Component
public interface ClassBComponent {
void inject(ClassB b);
}
4. 使用Dagger生成的Component在ClassB中注入ClassA,这里选择在ClassB的构造函数中注入
public class ClassB {
@Inject ClassA a;
public ClassB() {
DaggerClassBComponent.create().inject(this); // DaggerClassBComponent由Dagger根据之前定义的component自动生成,如果没有生成rebuild
}
}
至此Dagger2注入完成,这种注解方法需要编写和设计的类较多。
二、Dagger.Android
dagger.android对于Android开发中的Activity和Fragment更加友好,接入更简单。
1.gradle引入Dagger.Android依赖
implementation 'com.google.dagger:dagger-android:2.22.1'
implementation 'com.google.dagger:dagger-android-support:2.22.1' //项目中使用了支持包时需要引入
annotationProcessor 'com.google.dagger:dagger-android-processor:2.22.1'
2. 创建自定义Application,BaseActivity, BaseFragment(如有Fragment)
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AndroidInjection.inject(this); // 在Activity中注入
}
}
BaseFragment参照修改
3. 创建需要注入到具体Activity对应的Module类
@Module
public abstract class TestActivityModule {
@Provides
static HelloBean provideABC() { // 这里的方法名必须provide开头,注入只认类型
return new HelloBean();
}
}
4. 创建全局Module,绑定具体的Activity/Fragment和Module的关联
@Module
public abstract class AppModule {
@ContributesAndroidInjector(modules = TestActivityModule.class)
abstract TestActivity contributeTestActivityInjector();
// 可以绑定多个
}
5. 创建全局Component,引入全局Module和Dagger.Android关联Module
@Singleton
@Component(modules = {
AppModule.class, //全局的Module,要确保提供的对象是全局唯一的
AndroidInjectionModule.class, //在应用程序的MainComponent(applocation 中inject了)中,注入AndroidInjectionModule,
// 以确保Android的类(Activity、Fragment、Service、BroadcastReceiver及ContentProvider等)可以绑定。
// 一般把AndroidInjectionModule放在ApplicationComponent中,其他的Component依赖Application即可
AndroidSupportInjectionModule.class, //使用的Fragment 是V4 包中的?不然就只需要AndroidInjectionModule
)}
public interface AppComponent {
void inject(TestApplication application);
}
6. 在自定义Application中添加注入,Activity有注入的需让Application实现HasActivityInjector接口,Fragment需实现HasSupportFragmentInjector接口
public class KioskApplication extends Application implements HasActivityInjector, HasSupportFragmentInjector {
@Override
public void onCreate() {
DaggerAppComponent.create().inject(this); // 注入,DaggerAppComponent由Dagger根据AppComponent自动生成
}
// BaseActivity注入实现
@Inject DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
@Override
public AndroidInjector<Activity> activityInjector() { return dispatchingActivityInjector;}
// BaseFragment注入实现
@Inject DispatchingAndroidInjector<Fragment> dispatchingFragmentInjector;
@Override
public AndroidInjector<Fragment> supportFragmentInjector() { return dispatchingFragmentInjector;}
}
7.在具体的Activity或Fragment要注入某个Bean或其他属性直接在参数前加上@Inject即可,比如这里要在TestActivity中能自动注入HelloBean,写法如下:
public class TestActivity extends BaseActivity {
@Inject HelloBean helloBean; // 这样写就可以自动初始化完成了
}
Dagger.Android相对与单纯的Dagger更适合Android使用,只要先完成对Base的实现,后面添加新的Activity或Fragment时就会变的简单,也不需要对被注入的类进行改造。
以上就是我对Dagger2接触的一点理解,这里只是实战的快速入门,详细的原理和示例参照官方文档http://google.github.io/dagger