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
相关产品推荐
相关产品推荐

