Dagger父组件作用域:CoreComponent提供依赖是否为单例
Dagger 父/子组件作用域规则结论
首先明确核心规则:依赖是否为单例,仅和绑定声明的作用域、持有该绑定的组件实例生命周期直接相关,和子组件的作用域配置没有自动继承关系。
针对描述场景的具体解答
1. CoreComponent提供的依赖不默认都是单例
是否为单例分三种情况判断:
- 如果CoreComponent自身没有声明任何作用域:它提供的所有无作用域注解的依赖,无论AppComponent是否标注
@Singleton,每次注入时都会生成新实例,不会复用。 - 如果CoreComponent自身声明了和绑定匹配的作用域(比如CoreComponent标注
@Singleton,内部提供的依赖也标注@Singleton):只要你在App全局只初始化一次CoreComponent实例,这些匹配作用域的依赖就会是全局单例。 - 如果CoreComponent使用自定义独立作用域(比如自定义
@CoreScope):只有标注了@CoreScope的依赖会在CoreComponent的生命周期内保持单例,其余无注解、标注其他作用域的依赖都不会成为全局单例。
2. 父组件提供的依赖实例数量判断规则
父组件生成的依赖实例数没有固定答案,由两个条件决定:
- 绑定是否加了和组件匹配的作用域:加了匹配作用域的依赖会被组件实例缓存,在该组件实例的整个生命周期内只会创建1次,全局复用;没有加作用域的依赖,每次注入都会重新创建新实例。
- 初始化的组件实例数量:如果手动创建了多个CoreComponent实例,哪怕依赖标注了
@Singleton,每个组件实例都会持有独立的缓存,就会生成多个对应依赖的实例。常规Android项目实现中,CoreComponent、AppComponent都会在Application#onCreate中初始化一次,全局持有唯一实例,因此对应作用域的依赖才会保持全局唯一。
常见编译期坑点提醒
如果使用
component dependency方式实现CoreComponent作为AppComponent父组件的层级,两个组件不能声明相同的作用域,否则Dagger会在编译阶段直接抛出错误。如果使用@Subcomponent方式实现父子层级,父组件持有的作用域不能被子组件重复声明,子组件必须使用生命周期更短的自定义作用域(比如@ActivityScope、@FragmentScope)。
内容的提问来源于stack exchange,提问作者Ravindra-Ravi Verma
相关产品推荐
相关产品推荐

