首页 > 解决方案 > 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

标签: javasingletoncircular-dependencyinjectmicronaut

解决方案


从根本上说,这可能是您设计的问题。如果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;
    }
}

但是修复你的设计!


推荐阅读