Dagger 2.38.1 注解详解:核心注解与使用规范
前言
本文旨在深入解析 Dagger 2.38.1 版本中的核心注解,重点涵盖 @MapKey、@Scope、@Qualifier、@IntoSet、@IntoMap 和 @ElementsIntoSet。这些注解是构建依赖注入图的基础,理解它们的交互机制对于正确使用 Dagger 至关重要。
其中 @MapKey、@Scope、@Qualifier 三个注解仅可用于修饰其他注解(即元注解)。@MapKey 是 Dagger 自定义的注解,而 @Scope 和 @Qualifier 源自 javax.inject 包。
本文章节顺序经过精心编排,确保在讲解后续关联注解前,先介绍其前置依赖注解,以便读者建立完整的知识体系。
@Scope
@Scope 用于定义依赖对象的生命周期和作用范围。它必须修饰一个注解,该注解随后被用于标记组件或绑定方法。
@Scope 修饰的注解使用规则
- 节点限制:在同一个作用域节点上,使用
@Scope修饰的注解最多只能出现一次。 - Module 限制:被
@Module或@ProducerModule修饰的 Module 节点本身不允许直接使用 Scope 修饰的注解。 - Binding Method 限制:
- 在 Module 中,使用
@Provides、@Binds、@Multibinds、@BindsOptionalOf修饰的绑定方法允许同时使用@Scope修饰的注解。 - 注意:
@Produces、@Multibinds和@BindsOptionalOf修饰的方法通常不建议或不允许同时使用@Scope修饰,具体取决于实现细节,标准实践中主要关注@Provides和@Binds。
- 在 Module 中,使用
- 构造函数限制:
- 被
@Inject或@AssistedInject修饰的构造函数不允许直接同时使用@Scope修饰的注解。 - 但是,包含
@Inject构造函数的类所在的父级节点(如 Component)允许使用@Scope修饰的注解。 - 包含
@AssistedInject构造函数的类所在的父级节点不允许使用@Scope修饰的注解。
- 被
- Instance 限制:
@BindsInstance修饰的方法或其参数不允许同时使用@Scope修饰。
Scope 的作用域传递
@Scope 表示一个作用域,当前 Scope 修饰的注解修饰的节点所属的 currentComponent 节点及其往下的 Subcomponent 节点都可以使用该节点提供的实例。
以 @Singleton 为例:
@Module(subcomponents = {Subcomponent1.class, Subcomponent2.class, Subcomponent3.class})
{
A {
(b);
}
}
{
;
SubcomponentX ;
}
{
C c;
}
{
{}
}

