java - Micronaut 循环依赖
问题描述
如何解决micronaut中的循环依赖,我指的是链接javax.inject.Inject
爪哇
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。
我相信如果您使用 setter 注入其中一个引用,那么这将意味着您可以在另一个之前构造一个引用,但是在初始化期间会有一个短暂的时间段B.a
为空。可能无关紧要。
@Singleton
public class B {
private Provider<A> a;
@Inject
public void setA(Provider<A> a) {
this.a = a;
}
}
但是修复你的设计!
推荐阅读
- flutter - 在颤动中设置行和列内的数据
- php - 如何检查 WooCommerce 中是否是自定义产品类型选项?
- jquery - 如何获取具有选择性日期的 mongoos 数据
- javascript - 如何将 jquery 数据表导出限制为 1000 行
- r - 计算每个样本与组质心的 n 维欧几里德距离,并为 R 中的每个组选择最低的 3 个
- typescript - 如何仅使用打字稿打开/关闭 TS 文件中的 Foundation Modal 或选项卡(不使用 $ 访问变量)
- sql - 如何在sql中按指定的年月选择日期范围
- php - 如何将我的所有路线重定向到本地 laravel 中的 www 并同时生活
- ajax - 如何在ajax成功函数中使用for循环?
- scala - 无法将 DF 写为增量表我 spark 2.4.4 和 scala 2.12 java.lang.NoSuchMethodError: com.fasterxml.jackson.module.scala