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

Kotlin中Dagger 2带Named参数的构造注入编译失败解决方案咨询

解决Dagger注入带@Named限定符的接口依赖报错问题

你遇到的核心问题是Dagger没正确识别构造函数参数上的@Named限定符,导致它在寻找无标注的Spice类型依赖,而非对应名称的实例。下面一步步帮你搞定:

问题根源

你在SpiceMix构造函数参数上用了@field:[Named("xxx")],这个注解是作用在类的成员字段上的,但Dagger处理构造函数注入时,只会检查构造函数参数本身的注解。所以Dagger看到的是未加限定符的Spice参数,自然找不到对应的@Provides方法,就抛出了那个错误。

修复方案

把构造函数参数上的@field:Named改成@param:Named(或者直接写@Named就行,因为Kotlin中构造函数参数的注解默认目标就是param):

修改后的SpiceMix类:

@Singleton 
class SpiceMix @Inject constructor(
    @Named("oregano") private val oregano: Spice, 
    @Named("sage") private val sage: Spice, 
    @Named("rosemary") private val rosemary: Spice
)

如果想更清晰地标注注解目标,也可以显式写@param::

@Singleton 
class SpiceMix @Inject constructor(
    @param:Named("oregano") private val oregano: Spice, 
    @param:Named("sage") private val sage: Spice, 
    @param:Named("rosemary") private val rosemary: Spice
)

你的SpiceModule完全没问题,不需要修改——每个@Provides方法都带了对应的@Named限定符和@Singleton,和修改后的构造函数参数注解匹配后,Dagger就能正确找到对应依赖了。

测试时Mock依赖的方法

因为Spice是接口,你可以在测试中创建一个测试Module,提供Mock的Spice实例,同样带上对应的@Named注解:

@Module
class TestSpiceModule {
    @Provides
    @Named("oregano")
    @Singleton
    fun provideMockOregano(): Spice = mock(Spice::class.java)

    @Provides
    @Named("sage")
    @Singleton
    fun provideMockSage(): Spice = mock(Spice::class.java)

    @Provides
    @Named("rosemary")
    @Singleton
    fun provideMockRosemary(): Spice = mock(Spice::class.java)
}

之后在测试用的Dagger组件中,用这个TestSpiceModule替换原来的SpiceModule,注入的SpiceMix就会使用你Mock的Spice实例了。

内容的提问来源于stack exchange,提问作者Vas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:12:47