You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 10:03:20