启动时我的代码出现以下错误:
Tried proxying com.bar.Foo to support a circular dependency, but it is not an interface.
这个代理究竟是如何工作的?如果我只是在接口(interface)后面抛出足够多的类,一切都会好起来吗?
(我知道循环依赖通常是一种代码味道,但我认为在这种情况下没问题。)
最佳答案
虽然“注入(inject)接口(interface)”方法是完全有效的,并且在某些情况下甚至可能是更好的解决方案,但一般来说,您可以使用更简单的解决方案:Providers。
对于 guice 可以管理的每个类“A”,guice 还提供了一个“Provider<A>
”。这是 javax.inject.Provider 接口(interface)的内部实现,其 get()
消息将是“return injector.getInstance(A.class)
”。您不必自己实现接口(interface),它是“guice 魔法”的一部分。
因此您可以将 A->B, B-A 示例缩短为:
public class CircularDepTest {
static class A {
private final Provider<B> b;
private String name = "A";
@Inject
public A(Provider<B> b) {
this.b = b;
}
}
static class B {
private final Provider<A> a;
private String name = "B";
@Inject
public B(Provider<A> a) {
this.a = a;
}
}
@Inject
A a;
@Inject
B b;
@Before
public void setUp() {
Guice.createInjector().injectMembers(this);
}
@Test
public void testCircularInjection() throws Exception {
assertEquals("A", a.name);
assertEquals("B", a.b.get().name);
assertEquals("B", b.name);
assertEquals("A", b.a.get().name);
}}
我更喜欢这个,因为它更具可读性(你不会被愚弄到相信构造函数已经拥有一个“B”的实例)并且因为你可以自己实现提供者,它仍然可以“手动”工作,在guice 上下文(例如用于测试)。
关于java - Guice 代理支持循环依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10014825/