如何解决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;
}
工厂.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
最佳答案
从根本上讲,这可能是您的设计问题。如果A
和B
都需要相互引用,则它们太紧密了。他们可能应该只是一类。
无论如何,问题在于框架不知道首先创建哪个框架。处于22状态。没有A就无法创建A,没有A也就无法创建B。
我相信,如果您使用设置器注入引用之一,则意味着您可以先构建一个引用,但是在初始化期间会出现一小段时间,其中为null。可能无关紧要。
@Singleton
public class B {
private Provider<A> a;
@Inject
public void setA(Provider<A> a) {
this.a = a;
}
}
但是,请修改您的设计!
关于java - Micronaut循环依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57912219/