当前位置: 首页 > 知识库问答 >
问题:

Guice使用多个工厂方法和空参数辅助注入

姬康平
2023-03-14

我有这个接口和简单的实现:

public interface Data {    
}

import java.nio.file.Path;
import javax.annotation.Nullable;
import javax.inject.Inject;
import com.google.inject.assistedinject.Assisted;

public class SimpleData implements Data {
    @Inject
    public SimpleData(@Assisted @Nullable Path path) {
    }
}

我想使用Guice用不同的方法生成一个工厂

import java.nio.file.Path;

import javax.annotation.Nullable;

public interface Factory {
    Data create();
    Data load(@Nullable Path path);
}
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.assistedinject.FactoryModuleBuilder;

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(
                binder -> binder.install(
                            new FactoryModuleBuilder().implement(Data.class, SimpleData.class)
                                                      .build(Factory.class)));
        Data data = injector.getInstance(Factory.class).create();
    }
}
Exception in thread "main" com.google.inject.CreationException: Guice creation errors:

    1) No implementation for java.nio.file.Path annotated with @com.google.inject.assistedinject.Assisted(value=) was bound.
      while locating java.nio.file.Path annotated with @com.google.inject.assistedinject.Assisted(value=)
        for parameter 0 at SimpleData.<init>(SimpleData.java:10)
      at Factory.create(Factory.java:1)
      at com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:539)
      at com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:335)

    1 error
        at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435)
        at com.google.inject.internal.InternalInjectorCreator.injectDynamically(InternalInjectorCreator.java:175)
        at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:109)
        at com.google.inject.Guice.createInjector(Guice.java:95)
        at com.google.inject.Guice.createInjector(Guice.java:72)
        at com.google.inject.Guice.createInjector(Guice.java:62)
        at Main.main(Main.java:9)

共有1个答案

寇鸿
2023-03-14

我使用注释@assistedInject解决了我的问题。引用Javadoc:

当与FactoryModuleBuilder一起使用时,使用@AssistedInject注释的构造函数表示可以注入多个构造函数,每个构造函数具有不同的参数。

因此,我将注释和构造函数添加到SimpleData类:

public class SimpleData implements Data {
    @AssistedInject
    public SimpleData(@Assisted Path path) {

    }
    @AssistedInject
    public SimpleData() {

    }
}

我从工厂中删除了@nullable注释:

import java.nio.file.Path;

public interface Factory {
    Data create();
    Data load(Path path);
}
 类似资料:
  • 我一直在用guice做一个项目。 我有一个抽象类,它有很多实现。为了使用正确的实现,我使用一个工厂,它接收参数,然后返回正确的实例。 演示代码 我想知道的是,如果我可以用替换工厂,直接注入的实现(请注意,它们应该使用辅助注入)? 谢谢你。

  • 我正在使用Guice Assisted Inject库为我建立一个工厂。我目前的设置如下: 这迫使我使用< code > factory . create controller(first,factory . create second(first))显式创建一个< code>SecondDep。是否可以更改我的绑定,这样我就可以简单地执行< code > factory . create con

  • 我是一名guice新手,试图弄清楚如何使用FactoryModuleBuilder在guice中实现辅助注入。我参考了guice java文档来实现FactoryModuleBuilder。 我所做的一切都完全按照文件中所说的那样。这不是注射工厂。我提到了这个堆栈溢出问题:Guice AssistedInject不会注入具有相同问题的工厂。它讨论了构造函数注入之前的字段注入问题。我遵循了它,并尝试

  • 我已经使用google-guice和辅助注射机制有一段时间了。因为我在scala,刚刚发现scala-guice,我也对使用它感兴趣。但是我对如何使用辅助注射感到困惑。没有使用辅助注射的例子。 因此,我的问题是:是否可以使用scala guice辅助注射,如果可以,请提供一个简单的例子? 此外,对于google-guice,我使用以下库:javax.inject.jar、guice-3.0.jar

  • 看来Guice正在尝试使用不同于预期的创建方法。你知道怎么解决这个问题吗?如有任何指示,将不胜感激! 谢谢!

  • 假设有一个类A,它的构造函数是这样的: 还有AFactory: 所以要创建一个A的实例,我显然需要做这样的事情: 但是,假设我有其他类:例如,B类、C类和D类具有类型为A的成员(带有字段注入,但也可以是ctor): 我希望将 A 的相同实例注入到这些类中。但仍然可以选择将 A 的另一个实例注入其他类(假设 E 类和 F 类)。 正确的做法是什么?我就是想不出一个干净的方法来做到这一点。