gpt4 book ai didi

java - 为什么 Dagger 2 会强制我使用 @Provides 而不是 @Binds

转载 作者:行者123 更新时间:2023-12-01 21:58:39 29 4
gpt4 key购买 nike

我现在正在研究 Dagger 2 (Java),一开始就遇到了一个问题。遗憾的是,我在 Dagger 2 文档或 Stackoverflow 上找不到任何关于它的信息,所以如果你们知道一些资源,我将非常感激。

我在此存储库中准备了一个最小示例来解释我的问题:https://github.com/stackoverflow-samples/dagger2-dependency-cycle

所以我们得到了一个应该构造的Application

public class Application {

@Inject
public Application(SomeDependency one) {

}

public static void main(String[] args) {
DaggerApplicationComponent.create().build();
}
}

... 具有虚拟依赖性

public class SomeDependency {

@Inject
public SomeDependency() {

}
}

当然还有 Dagger 类/接口(interface)........ 组件接口(interface):

@Component(modules = ApplicationModule.class)
public interface ApplicationComponent {
Application build();
}

.. 和一个模块:

@Module
abstract class ApplicationModule {
@Provides
static SomeDependency provideDepdendencyOne() {
return new SomeDependency();
}
}

我不明白的是为什么 Dagger 强制我使用 @Provides 注释注册 SomeDepdendency 并且不允许通过 @Binds 注册它:

@Binds 
abstract SomeDependency bindDepdendencyOne(SomeDependency one);

每当我将代码从 @Provides 更改为 @Binds 时,都会出现以下错误:

[Dagger/DependencyCycle] Found a dependency cycle:
io.github.codejanovic.dagger2.example.SomeDependency is injected at
io.github.codejanovic.dagger2.example.ApplicationModule.bindDepdendencyOne(one)
io.github.codejanovic.dagger2.example.SomeDependency is injected at
io.github.codejanovic.dagger2.example.Application(one)
io.github.codejanovic.dagger2.example.Application is provided at
io.github.codejanovic.dagger2.example.ApplicationComponent.build()

无法@Bind 实现对我来说完全没有意义。我监督什么?

提前致谢。

最佳答案

您假设首先需要 @Binds@Provides 是错误的。您可以而且应该使用构造函数注入(inject)——不是模式,但是 Dagger 会为我生成代码

您已经有了使用@Inject 注释的构造函数,因此Dagger 知道该类以及如何创建它。没有别的事可做。

public class SomeDependency {

@Inject
public SomeDependency() {

}
}

对于您的这个简单用例,您不需要任何@Provides,不需要@Binds,甚至不需要@Module。您的示例应该开箱即用,因为两个构造函数都带有 @Inject 注释。

@Component
public interface ApplicationComponent {
Application build();
}

如果您需要指定范围,您可以将其添加到类中。


@Provides 应该用于您不能使用构造函数注入(inject)的代码,或者需要额外设置的代码。当然,您可以手动创建所有对象(就像您在示例中所做的那样),但这没有实际好处,只会产生大量可以避免的样板文件。

@Binds 用于需要绑定(bind)到接口(interface)的实现。最佳情况下,您也可以使用构造函数注入(inject)来实现,但您也可以将其添加到组件构建器(@BindsInstance)或在带注释的@Provides 中创建它方法。

@Binds MyInterface bindMyImplementation(MyImplementation implementation);

关于java - 为什么 Dagger 2 会强制我使用 @Provides 而不是 @Binds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54713319/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com