如何在 dagger2 中模拟循环依赖?
How model circular dependency in dagger2?
如何使用 dagger2 对循环依赖建模?
假设我们只有两个 类。第一次注入是通过构造函数进行的,第二次是通过方法进行的,如下例所示:
class A{
private B b;
@Inject
public A(B b)
{
this.b = b;
}
}
class B{
private A a;
@Inject
public B() { }
@Inject
public void injectA(A a)
{
this.a = a;
}
}
据我所知你不能。
像这样的依赖关系表明 A 和 B 可能比它们应该的更紧密。合并它们或重构 C
中的公共部分
将 Provider<A>
或 Provider<B>
注入其中一个,而不是直接注入 A 或 B。然后,只要两个 类 在构造函数中都不需要另一个,它就会起作用。如果他们在构造函数中都需要对方,那就没办法了。
可以使用lazy注入:
class B{
private Lazy<A> a;
@Inject
public B(Lazy<A> a) {
this.a = a;
}
}
或者您可以注入 Provider<A>
,但请注意每次调用 Provider::get
时提供者 returns A 的新实例(假设默认范围),而 Lazy::get
returns 同一个实例。
如何使用 dagger2 对循环依赖建模? 假设我们只有两个 类。第一次注入是通过构造函数进行的,第二次是通过方法进行的,如下例所示:
class A{
private B b;
@Inject
public A(B b)
{
this.b = b;
}
}
class B{
private A a;
@Inject
public B() { }
@Inject
public void injectA(A a)
{
this.a = a;
}
}
据我所知你不能。
像这样的依赖关系表明 A 和 B 可能比它们应该的更紧密。合并它们或重构 C
中的公共部分将 Provider<A>
或 Provider<B>
注入其中一个,而不是直接注入 A 或 B。然后,只要两个 类 在构造函数中都不需要另一个,它就会起作用。如果他们在构造函数中都需要对方,那就没办法了。
可以使用lazy注入:
class B{
private Lazy<A> a;
@Inject
public B(Lazy<A> a) {
this.a = a;
}
}
或者您可以注入 Provider<A>
,但请注意每次调用 Provider::get
时提供者 returns A 的新实例(假设默认范围),而 Lazy::get
returns 同一个实例。