gpt4 book ai didi

java - Micronaut 循环依赖

转载 作者:行者123 更新时间:2023-12-02 00:44:12 25 4
gpt4 key购买 nike

如何解决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;
}

异常(exception):

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

最佳答案

从根本上来说,这可能是您的设计存在问题。如果 AB 都需要相互引用,则它们耦合得太紧密。他们可能应该只是一个类。

无论如何,问题是框架不知道先创建哪个。它处于第 22 条军规的情况;没有 A 就无法创建 A,没有 A 就无法创建 B。

我相信,如果您使用 setter 注入(inject)其中一个引用,那么这将意味着您可以在另一个引用之前构造一个引用,但在初始化期间会有一段短暂的时间,其中 B.a 为 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/

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