Java Micronaut循环依赖

Java Micronaut循环依赖,java,singleton,circular-dependency,inject,micronaut,Java,Singleton,Circular Dependency,Inject,Micronaut,如何解决micronaut中的循环依赖,我指的是链接 A.java import javax.inject.Inject; import javax.inject.Provider; import javax.inject.Singleton; @Singleton public class A { @Inject private Provider<B> b; } 例外情况: 23:22:04.354 [nioEventLoopGroup-1-5] DEBUG i.

如何解决micronaut中的循环依赖,我指的是链接

A.java

import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
@Singleton
public class A {
    @Inject
    private Provider<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
为null。可能无关紧要

@Singleton
public class B {
    private Provider<A> a;

    @Inject
    public void setA(Provider<A> a) {
        this.a = a;
    }
}
@Singleton
公共B级{
私人供应商a;
@注入
公共无效setA(提供程序a){
这个a=a;
}
}

但要修正你的设计

我认为
这个.a=a
甚至不应该编译<代码>这个。a是一个
提供者
但是
a
是一个
a
@JeffScottBrown你说得对,只是一个转录错误。
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
@Singleton
public class B {
    private Provider<A> a;

    @Inject
    public void setA(Provider<A> a) {
        this.a = a;
    }
}