gpt4 book ai didi

java - Guice 代理支持循环依赖

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:06 25 4
gpt4 key购买 nike

启动时我的代码出现以下错误:

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/

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