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

Eclipse RCP:注入标记@Singleton的接口时依赖注入失败排查

为什么@Creatable+@Singleton组合无法注入接口?怎么解决?

这个问题我之前也碰到过,核心原因其实是Dagger的@Creatable注解的作用范围有限——它只会把你的实现类本身注册到依赖注入容器里,不会自动关联它所实现的接口。

具体原因拆解:

  • 当你给DummyInterfaceImpl1加上@Creatable和@Singleton时,Dagger确实会自动创建这个类的单例实例,但它在依赖图里只记录了「DummyInterfaceImpl1类型 → 它的实例」这个绑定关系。
  • 当你尝试注入DummyInterface时,Dagger会去依赖图里找「DummyInterface类型」对应的绑定,结果找不到,自然就抛出了那个错误。
  • 而直接注入DummyInterfaceImpl1时,Dagger能直接匹配到已有的绑定,所以能正常工作。

解决方法:手动声明接口与实现类的绑定

要让Dagger知道当需要DummyInterface时应该提供DummyInterfaceImpl1的实例,你需要通过Dagger Module来显式声明这个绑定关系,有两种常用方式:

方式1:用@Binds注解(推荐,更高效)

创建一个抽象Module,用@Binds方法把接口绑定到实现类:

@Module
public abstract class DummyModule {
    @Binds
    @Singleton // 保持单例作用域和实现类一致
    abstract DummyInterface bindDummyInterface(DummyInterfaceImpl1 impl);
}

然后把这个Module添加到你的Dagger Component中(比如在Component的@Component(modules = {DummyModule.class})里声明)。

方式2:用@Provides注解(适合有额外创建逻辑的场景)

如果你的实现类需要额外的初始化逻辑,可以用@Provides方法:

@Module
public class DummyModule {
    @Provides
    @Singleton
    static DummyInterface provideDummyInterface() {
        // 这里可以添加自定义初始化逻辑
        return new DummyInterfaceImpl1();
    }
}

同样需要把这个Module关联到你的Component上。

补充说明:

@Creatable的核心作用是让Dagger无需Module就能创建该类的实例,但它不会自动处理接口与实现类的映射——这种多态绑定必须由开发者通过Module显式声明,这也是Dagger保证依赖注入清晰可控的设计原则之一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:38:49