google四件套之Dagger2。从入门到爱不释手,之:Dagger2进阶知识及在Android中使用

前言

网上都说Dagger2是比较难上手的,我在看了大量资料和使用时也遇到了不少不懂或者模糊的知识点,并且大部分博客资料都比较古老。忽然有那么一瞬间,忽然明白了因此然,故总结了4篇文章。话说在java中使用仍是很繁琐的,不要怕带你真正上手,并运用到咱们的Android项目中去。java

本次Dagger2讲解总共分4篇:
一、Dagger2基础知识及在Java中使用(1)
二、Dagger2基础知识及在Java中使用(2)
三、Dagger2进阶知识及在Android中使用
四、Dagger2华丽使用在MVP框架中android

经过前2篇文章的学习,已经熟悉Dagger2在Java中的使用了。可是你会发现,每次须要注入都要写对应的Component后,Inject到相关也面。并且在每一个页面都要DaggerComponent.builder().build.inject(activity)。这样是太繁琐,还没开始,就以为繁琐了。因此强大google推出了扩展包dagger.android。git

仍是老样子,博客贴的代码,有部分省略,只为便于理解。
github

Dagger2在Android中的使用

本篇就一节。只要配置好相关信息后,全局Component只有一个。Module你能够写多个,其实也能够只写2个,为何呢,看下面。
首先是添加依赖,以前Java的依赖跟这里不相关哦app

implementation 'com.google.dagger:dagger-android:2.24'
    // if you use the support libraries(就是你须要v4.Fragment就须要加上support包)
    implementation 'com.google.dagger:dagger-android-support:2.24'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.24'
    annotationProcessor 'com.google.dagger:dagger-android-processor:2.24'
复制代码


这里举2个例子把,一个带Module和一个不带Module的在Android中的使用,不带Module的小孩类Children以下,在其构造方法加上@Inject标注:框架

public class Children {
    @Inject
    public Children() {

    }
}
复制代码


而后是带Module的超人类SurperMan,假设是一个第三方类库,不能带@Inject标注。ide

public class SurperMan {
}
复制代码


咱们此时的Modulepost

@Module
public class SurperManModule {
    @Provides
    SurperMan surperManProvides(){
        return new SurperMan();
    }
}
复制代码


这个时候dagger.android包提供了一个@ContributesAndroidInjector标注是为了省去咱们每次去Activity里初始化Component,以下学习

@Module
//抽象类,名字自定义,
public abstract class NeedInjectModules {
    //这个方法的意思标识要注入到ForAndroidActivity页面。若是须要在MainActivity页面的话。继续加这个方法,返回值为
    //MainActivity便可
    @ContributesAndroidInjector
    abstract ForAndroidActivity inject();
}
复制代码


以前就提过,在dagger.android包里。大概思路是在Application初始化ApplicationComponent,而后咱们经过@ContributesAndroidInjector标注,他内部帮我实现了Component依赖Component。那么咱们的惟一个Component长这样ui

//这里AndroidSupportInjectionModule是系统的,必须加上
//NeedInjectModules是咱们要注册到Activity的
//SurperManModule,surperMan的
@Component(modules = {
        AndroidSupportInjectionModule.class,
        NeedInjectModules.class,
        SurperManModule
})

//继承AndroidInjector<T>,泛型就是咱们的application
public interface AppComponent extends AndroidInjector<MyApplication> {
    
    //还记得@Component.Builder的用法吗,能够看以前的。
    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }

}
复制代码


这些准备工做都作完了后,记得Make Project,接下来是重点了,咱们的Application继承DaggerApplication,这里会实现一个方法,是将咱们的AppComponent.Builder返回出去,以下

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

}
复制代码


这里也是关键点,在Activity里使用或者在Fragment里使用,只需继承咱们的DaggerActivity&DaggerFragment。直接看咱们的Activity

public class ForAndroidActivity extends DaggerAppCompatActivity {
    @Inject
    Children children;
    @Inject
    SurperMan surperMan;
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_astudy);
        LogUtils.i("已经生成实例",children.hashCode()+"");
        LogUtils.i("已经生成实例",surperMan.hashCode()+"");
    }
}
复制代码


至此,在Android中的简单使用,已经所有介绍完,是否是代码比较简洁。是否是已经爱不释手了!

本文github Demo地址

花了老大劲,别误会,不是要钱。能不能留下个足迹star啊

相关文章
相关标签/搜索