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

Dagger2使用@BindsInstance注入时报DependencyCycle依赖循环错误

错误原因

出现Dagger/DependencyCycle循环依赖报错的核心原因是对MainTest类型做了重复的错误绑定:

  • 你已经通过Component.Builder上的@BindsInstance注解,将外部传入的MainTest实例直接加入了Dagger依赖图
  • 同时你在MainModule中定义的provideMainTest方法,入参要求Dagger注入MainTest类型,返回值也是MainTest类型,等于Dagger要获取MainTest就必须调用这个提供方法,但调用这个方法首先得拿到MainTest入参,直接形成了依赖死循环。
修复方式

两种方案选其一即可,不要对同一类型做重复绑定:

  • 方案1:保留@BindsInstance绑定,删除Module中冗余的提供方法
    如果你本来就打算在构建Component时从外部传入MainTest实例(比如传入运行时动态创建的对象、上下文实例等),直接删掉MainModule里的provideMainTest方法即可:

    @Module
    class MainModule {
        // 移除整个provideMainTest方法
    }
    

    构建Component时正常传入实现类实例就行:

    val mainComponent = DaggerMainComponent.builder()
        .mainDep(MainTestImpl())
        .build()
    mainComponent.inject(this)
    
  • 方案2:保留Module提供逻辑,删除Builder上的实例绑定
    如果你希望由Dagger通过Module自动创建MainTest实例,就删掉Component.Builder里的mainDep方法和对应的@BindsInstance注解,同时修改Module里的提供方法,不再要求入参注入MainTest,直接返回实现类实例:

    @Module
    class MainModule {
        @Provides
        fun provideMainTest(): MainTest = MainTestImpl()
    }
    

    这种写法不需要在构建Component时手动传入MainTest实例,Dagger会自动完成实例创建和注入。

注意点

@BindsInstance的作用是直接将外部传入的现成实例加入依赖图,一旦用了这个注解绑定某类型,就不需要再在Module中编写该类型的提供方法,否则很容易出现重复绑定、循环依赖类的编译错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:39:14