关于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部分注解的理解。
网友评论