java - Guice 辅助注入(inject)几个工厂方法和空参数

标签 java dependency-injection guice

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

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 使用不同的方法生成一个 Factory

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)

最佳答案

我使用注释 @AssistedInject 解决了我的问题.引用自 javadoc:

When used in tandem with FactoryModuleBuilder, constructors annotated with @AssistedInject indicate that multiple constructors can be injected, each with different parameters.

所以我将注释和构造函数添加到 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);
}

关于java - Guice 辅助注入(inject)几个工厂方法和空参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25642021/

相关文章:

dependency-injection - 从范围服务工厂获取主机名

java - 在 Play 中使用 Guice : Injection possible for static fields only

java - 来电重置 Activity/Fragment 中的 EditText 值

java - 如何指定Spring表单中默认选择哪个值:select

symfony - 在 Symfony2 中,为什么注入(inject)服务容器而不是单个服务是一个坏主意?

node.js - NestJS 未定义的依赖项

scala - 如何使用 Play 2.4 将服务注入(inject)到 Actor 中?

java - Google Guice 依赖注入(inject) - 对象到底是在哪里创建的?

java - 在 Java 中导入包

java - Spring 3 MVC + hibernate 3.5.x : Autowiring and Dependency Injection of SessionFactory