如何在micronaut中解决循环依赖,我指的是链接javax.inject.Inject
A.java
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
@Singleton
public class A {
@Inject
private Provider<B> b;
}B.java
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
@Singleton
public class B {
@Inject
private Provider<A> a;
}Factory.java
import io.micronaut.context.annotation.Factory;
import javax.inject.Inject;
import javax.inject.Singleton;
@Factory
public class Factory {
@Inject
private A a;
@Inject
private B b;
}例外:
23:22:04.354 [nioEventLoopGroup-1-5] DEBUG i.m.h.s.netty.RoutingInBoundHandler:1357-Encoding emitted response object [Internal Server Error: Failed to inject value for parameter [b] of class: B
Message: Circular dependency detected
Path Taken:
Factory.a --> new A([B b]) --> new B([A a])
^ | |
+----------------------------------+] using codec: io.micronaut.jackson.codec.JsonMediaTypeCodec@35a578发布于 2019-09-13 02:11:40
从根本上说,这可能是您的设计存在问题。如果A和B都需要彼此的引用,那么它们的耦合太紧密了。它们可能只是一个类。
无论如何,问题是框架不知道首先创建哪一个。它处于第22条军规的情况下;没有A就不能创建A,没有A就不能创建B。
我相信如果你用setter注入一个引用,那么就意味着你可以在另一个引用之前构造一个引用,但在初始化过程中会有一小段时间B.a为空。可能无关紧要。
@Singleton
public class B {
private Provider<A> a;
@Inject
public void setA(Provider<A> a) {
this.a = a;
}
}但是修改你的设计!
https://stackoverflow.com/questions/57912219
复制相似问题