美文网首页
Dagger2及Dagger.Android简单使用

Dagger2及Dagger.Android简单使用

作者: lavzchen | 来源:发表于2019-05-15 13:15 被阅读0次

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

    相关文章

      网友评论

          本文标题:Dagger2及Dagger.Android简单使用

          本文链接:https://www.haomeiwen.com/subject/stzjmttx.html