Dagger2学习笔记

Posted 若兰明月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dagger2学习笔记相关的知识,希望对你有一定的参考价值。

来自kotlin打造完整电商APP视频学习笔记

如何依赖使用

第一步

在Project的build.gradle中添加

 dependencies 
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' //添加apt命令

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    

第二步

在module(app)中的build.gradle中添加

apply plugin: 'android-apt'//(添加到第二行就行)
dependencies 
  //dagger2
    apt 'com.google.dagger:dagger-compiler:2.0.2' //指定注解处理器
    compile 'com.google.dagger:dagger:2.0.2'  //dagger公用api
    provided 'org.glassfish:javax.annotation:10.0-b28'  //添加android缺失的部分javax注解

简单介绍

@inject

通常在需要依赖的地方使用这个注解。换句话说。你用它告诉Dagger2这个类或者字段需要依赖注入。这样Dagger2就会构造一个这个类的实例并满足他们的依赖

@Module

Modules类里面的方法专门提供依赖,所以我们定义一个类,用@Module注解,这样Dagger在构造类的实例的时候,就知道从哪里找到需要的依赖,modules的一个重要特征是他们设计为分区并组合在一起(比如说我们的app中可以有多个组成在一起的modules)

@Provide

在modules,我们定义的方法使用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖

@Component

Components从根本上来说就是一个注入器,也可以说是@Inject和@Module的桥梁,他的主要作用就是连接这两个部分,Components可以提供所有定义了的类型的实例,比如:我们必须用@Component注解一个借口然后列出所有的

限定符

@Qualifier

主要用来区分不同对象实例
首先这个需要去自己定义一个


@Qualifier
@Documented
@Retention(RUNTIME)
public @interface Debug 


然后在module里面这样使用(确保使用的@Debug和自己定义的类名是一样的(不是类名 类似于一个接口的自定义注解))

    @Provides
    @Debug
    public ApiServer provideApiServerForDebug(OkHttpClient client)
        Log.d("UserModule", "provideApiServerForDebug");
        return new ApiServer(client);
    

最后在Activity或者Fragment或者Presenter里面这样使用( @Debug确保一致)

    @Inject
    @Debug
    ApiServer mApiServerDebug;
@Named

其实是@Qualifier的一种实现
首先在module里面 使用@Named限定符限定(里面定义好限定key值)

  @Provides
    @Named("release")
    public ApiServer provideApiServerForRelease(OkHttpClient client)
        Log.d("UserModule", "provideApiServerForRelease");
        return new ApiServer(client);
    

然后在Activity或者Fragment或者Presenter里面使用的时候也使用相同的限定符,并且保证key值一样,才能达到效果。

    @Inject
    @Named("release")
    ApiServer mApiServerRelease;

单例

@Singleton

在module里面 也就是提供实例的方法上加入@Singleton

  @Provides
    @Singleton
    public OkHttpClient provideOkHttpClient()
        return new OkHttpClient.Builder().build();
    

然后在Component的类上面加入@Singleton(确保这俩个地方都要加入,要不然会报错的)


@Singleton
@Component(modules = UserModule.class)
public interface UserComponent 

    void inject(MainActivity activity);

例子

    @Inject
    OkHttpClient mOkHttpClientDemo1;
    @Inject
    OkHttpClient mOkHttpClientDemo2;

我们看下输出:

01-24 23:27:50.640 26451-26451/ruolan.com.cndagger2 D/MainActivity: mOkHttpClientDemo1:okhttp3.OkHttpClient@64cbd28
01-24 23:27:50.641 26451-26451/ruolan.com.cndagger2 D/MainActivity: mOkHttpClientDemo2:okhttp3.OkHttpClient@64cbd28

可以看出来,虽然我们创建两个两个实例,但是这两个实例指向的是同一个地址,也就是说他俩是同一个对象,这也就是单例的实现。

注意事项(重要)

第一条

component的inject方法接收父类型参数,而调用时传入的子类型的对象则无法实行注入

第二条

component关联modules中不能有重复的provide

第三条

module的provide方法使用了scope,那么component就必须使用同一个注解(比如module使用了@Singleton,那么component也一样要使用)

第四条

module的provide方法没有使用scope,那么component和module是否添加注解都无关紧要,可以通过编译

第五条

component的dependencies与component自身的scope不能相同,即组件之间的scope不同

第六条

Singleton的组件不能依赖其他scope的组件,只能其他scope的组件依赖Singleton的组件

第七条

没有scope的component不能依赖有scope的component

第八条

一个component不能同时又多个scope(Subcomponent除外)

第九条

@Singleton的生命周期依附于component,同一个module provide singleton 不同component也是不一样的

以上是关于Dagger2学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

dagger2 重点笔记

Android Dagger2.0 学习一下

dagger2简单使用与理解笔记

dagger2简单使用与理解笔记

python学习笔记之集合2

Dagger2学习资源