03.对注解的分类讲解——Module部分(一)

关于Dagger2

  • Dagger基础用法
  • 对注解的分类讲解——Inject部分
  • 对注解的分类讲解——Module部分(一)
  • 对注解的分类讲解——Component部分
  • 对注解的分类讲解——Module(二)
  • 对注解的分类讲解——Module(三)
  • 对Dagger中几个类的说明
  • Dagger-Android的使用

前言

本文将通过对注解的分类讲解来交代Dagger2的进阶用法。

关于Dagger的注解,简单将它们分成三类:

  • Component部分
  • Module部分
  • Inject部分
注解分类

来对应Dagger完成依赖注入的三部分内容,知道了Inject部分有哪些所使用的注解后,我们先来看一看Module部分的其中一部分注解的概念和使用方法,方便之后的注解理解。

Module部分注解

@Module

@Module注解用于获取对象实例的类,Dagger2根据该注解知道应该去哪个类里获取对象实例。

由于Module作为与Component直接进行通信的单元,所以需要进行依赖注入的对象都需要在Module中提供,在通过Dagger进行注入的对象都必须能够在Module中找到对象,包括提供对象所包含的参数,举个例子:

@Module
public class ModuleAnnotationsModule {

    // 需要提供的对象
    @Provides
    ModuleAnnotations providerModuleAnnotations(ModuleAnnotationsConfig config) {
        return new ModuleAnnotations(config);
    }

    // ModuleAnnotations中的参数也需要通过Module提供
    @Provides
    ModuleAnnotationsConfig providerModuleAnnotationsConfig() {
        return new ModuleAnnotationsConfig();
    }
}

但是有时候又需要将注入对象和它的参数进行分离,比如上例的ModuleAnnotationsConfig需要同时提供给多个对象作为参数,这时候应该怎么办呢?

在@Module注解中提供了两个参数用来解决这个问题:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Module {
    // 用于指定子Module
    Class[] includes() default {};

    // 与@Subcomponent注解有关,在之后的讲解中会提到
    @Beta
    Class[] subcomponents() default {};
}

具体实现:

// 将ModuleAnnotationsModule拆分出来定义一个SubModuleAnnotationsModule
@Module
public class SubModuleAnnotationsModule {
    @Provides
    ModuleAnnotationsConfig providerModuleAnnotationsConfig() {
        return new ModuleAnnotationsConfig();
    }
}

修改MainModule部分的代码:

// 指定包含的Module
@Module(includes = SubModuleAnnotationsModule.class)
public class ModuleAnnotationsModule {
    @Provides
    ModuleAnnotations providerModuleAnnotations(ModuleAnnotationsConfig config) {
        return new ModuleAnnotations(config);
    }
}

通过这种方式就可以将部分所提供的对象拆分出来给其它所需要的Module去使用。

Module每次会现在自己里面寻找所需要的对象,如果没找到就会去它制定的包含Module中去寻找,以此类推,最后如果没有找到的话会报错。

@Provides

@Provides注解用于module类中获取对象实例的方法,Dagger2根据该注解及方法的返回值类型将对象实例注入到对应的引用中。

@Module注解中的例子可以看到,@Provides的使用方法。

@Singleton

@Singleton注解从字面上来理解就是单例的意思,要使对象成为单例只需要同时在@Provides注解的方法和component接口上添加@Singleton这个注解即可。

@Singleton
@Component(modules = {SingletonAnnotationsModule.class})
public interface SingletonAnnotationsComponent {
    void inject(SingletonAnnotationsActivity activity);
}

方式 1 :

@Module
public class SingletonAnnotationsModule {

    @Singleton
    @Provides
    SingletonAnnotations providerSingletonAnnotations() {
        return new SingletonAnnotations();
    }
}

或者方式 2:

@Singleton
public class SingletonAnnotations{
    @Inject
    public SingletonAnnotations() {
    }
}

这样就可以实现单例啦,是不是很简单,但是@Singleton注解注解实现的并不是真正的单例,只是在与指定Component所绑定的环境中处于单例的状态,如果是两个不同的Component,则它们所生成的对象不能被称为单例。

要注意在@Singleton注解背后真正起作用的是@Scope注解。

@Scope

单例模式@Singleton注解的背后推手,被@Scope注解所注释,注入器创建实例后会进行保存,以便在稍后的注射中可能重用,从而实现“单例”状态。

总结

本文主要介绍部分Module中所使用的注解,有助于之后关于Component部分注解的理解。

你可能感兴趣的:(03.对注解的分类讲解——Module部分(一))