美文网首页
03.对注解的分类讲解——Module部分(一)

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

作者: redrain39 | 来源:发表于2020-01-09 09:02 被阅读0次

    关于Dagger2

    前言

    本文将通过对注解的分类讲解来交代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部分(一)

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