Guice Inject Field in class NullPointerException,引入了循环依赖问题
Guice Inject Field in class NullPointerException, circular dependency issue introduced
我需要使用在单独库中定义的 Guice 中创建单例。
@RequiredArgsConstructor
public class Operator {
@NonNull private final Catalog catalog;
@Inject private Evaluator evaluator;
...
}
其中一个问题是 class 引入了循环依赖,Evaluator -> Operator -> Evaluator。我知道这不是一个好的设计,但被其他包消耗了,没有简单的方法来改变它。这个库有使用 Spring 框架创建的 beans,可以在其中处理这种循环依赖。
现在我需要在基于 Guice 的服务中创建一个 Operator 的实例,我已经在服务中创建了单例 Evaluator,但是无法将单例注入 Operator。
@Provides @Singleton
public Operator operator(final Catalog catalog)
{
return new Operator(catalog);
}
@Provides @Singleton
public Evaluator evaluator(final Operator operator) {
return new Evaluator(operator);
}
由于 Operator class 正在用于基于 Spring 框架的其他服务,我不想更改它。我该怎么做才能使 Guice 能够将 Evaluator 注入 Operator?
在此先感谢您的帮助!
试试这个,希望对你有帮助。
public class Evaluator {
@Inject public Evaluator(Operator op) {
// ...
}
}
public class Operator {
@Inject public Operator(map m) {
// ...
}
}
public class map {
@Inject public map(Provider<Evaluator> EvaluatorProvider) {
// ...
}
}
在这种循环依赖的情况下,Guice不够智能,无法帮助注入依赖,你可以专门让Guice为此注入依赖class。
@Provides @Singleton
public Operator operator(final Catalog catalog)
{
return new Operator(catalog);
}
然后 injector.injectMembers(injector.getInstance(Operator.class))
将有助于注入所需的依赖项。
我需要使用在单独库中定义的 Guice 中创建单例。
@RequiredArgsConstructor
public class Operator {
@NonNull private final Catalog catalog;
@Inject private Evaluator evaluator;
...
}
其中一个问题是 class 引入了循环依赖,Evaluator -> Operator -> Evaluator。我知道这不是一个好的设计,但被其他包消耗了,没有简单的方法来改变它。这个库有使用 Spring 框架创建的 beans,可以在其中处理这种循环依赖。
现在我需要在基于 Guice 的服务中创建一个 Operator 的实例,我已经在服务中创建了单例 Evaluator,但是无法将单例注入 Operator。
@Provides @Singleton
public Operator operator(final Catalog catalog)
{
return new Operator(catalog);
}
@Provides @Singleton
public Evaluator evaluator(final Operator operator) {
return new Evaluator(operator);
}
由于 Operator class 正在用于基于 Spring 框架的其他服务,我不想更改它。我该怎么做才能使 Guice 能够将 Evaluator 注入 Operator?
在此先感谢您的帮助!
试试这个,希望对你有帮助。
public class Evaluator {
@Inject public Evaluator(Operator op) {
// ...
}
}
public class Operator {
@Inject public Operator(map m) {
// ...
}
}
public class map {
@Inject public map(Provider<Evaluator> EvaluatorProvider) {
// ...
}
}
在这种循环依赖的情况下,Guice不够智能,无法帮助注入依赖,你可以专门让Guice为此注入依赖class。
@Provides @Singleton
public Operator operator(final Catalog catalog)
{
return new Operator(catalog);
}
然后 injector.injectMembers(injector.getInstance(Operator.class))
将有助于注入所需的依赖项。