Dagger2及Dagger.Android简单使用

本文针对的是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 dispatchingActivityInjector;

    @Override

    public AndroidInjector activityInjector() { return dispatchingActivityInjector;}

    // BaseFragment注入实现

    @Inject DispatchingAndroidInjector dispatchingFragmentInjector;

    @Override

    public AndroidInjector 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

你可能感兴趣的:(Dagger2及Dagger.Android简单使用)