Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Guice通过几个工厂方法和空参数辅助注入_Java_Dependency Injection_Guice - Fatal编程技术网

Java Guice通过几个工厂方法和空参数辅助注入

Java Guice通过几个工厂方法和空参数辅助注入,java,dependency-injection,guice,Java,Dependency Injection,Guice,我有这个接口和简单的实现: 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

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

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)
线程“main”com.google.inject.CreationException中的异常:GUI创建错误: 1) 未绑定用@com.google.inject.assistedinject.Assisted(value=)注释的java.nio.file.Path的实现。 查找用@com.google.inject.assistedinject.Assisted(value=)注释的java.nio.file.Path时 用于SimpleData处的参数0。(SimpleData.java:10) 创建(Factory.java:1) 位于com.google.inject.assistedinject.FactoryProvider2.initialize(FactoryProvider2.java:539) 位于com.google.inject.assistedinject.FactoryModuleBuilder$1.configure(FactoryModuleBuilder.java:335) 1错误 位于com.google.inject.internal.Errors.ThrowCreationExceptionIferErrorSexist(Errors.java:435) 在com.google.inject.internal.InternalInjectorCreator.injectDynamics上(InternalInjectorCreator.java:175) 在com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:109)上 位于com.google.inject.Guice.createInjector(Guice.java:95) 位于com.google.inject.Guice.createInjector(Guice.java:72) 位于com.google.inject.Guice.createInjector(Guice.java:62) Main.Main(Main.java:9)
@Nullable
并不意味着如果没有绑定,那么将注入
null
。它只允许将绑定写入
null
。如果您没有绑定,并且没有适用的JIT绑定,那么注入将失败

工厂的
create()
方法要求Guice查找
@辅助路径
绑定,但它显然找不到,因为您从未创建过路径,所以它失败了

老实说,我不确定是否有一个干净的方法来实施这种违约。理想情况下,您应该使用一些绑定注释标记
路径
,并为其添加一个默认绑定为null,但是
@Assisted
已经是一个绑定注释,并且不可能在一个注入点上有多个绑定注释。您可以尝试为
@Assisted Path
创建绑定:

binder.bind(Path.class).annotatedWith(Assisted.class).toInstance(null);

但是,我不确定它是否有效,因为
Assisted
对Guice来说是特殊的。即使它可以工作,它也不是很干净-可能与接受
路径
s的其他辅助工厂有冲突。

我会让Guice实现某种内部工厂接口,然后公开其他东西。像这样:

interface InternalFactory {
    Data load(@Nullable Path path);
}

public interface Factory {
    Data load();
    Data load(@Nullable Path path);
}

class FactoryImpl implements Factory {
    @Inject InternalFactory internalFactory;

    @Override
    public Data load() {
        return load(null); // Pass your defaults here
    }

    @Override
    public Data load(@Nullable Path path) {
        // Sadly you'll have to explicitly forward arguments here, but it's not
        // too bad IMO
        return internalFactory.load(path);
    }
}

public class MyModule extends AbstractModule {
    @Override
    protected void configure() {
        install(new FactoryModuleBuilder()
                .implement(Data.class, SimpleData.class)
                .build(InternalFactory.class));

        bind(Factory).to(FactoryImpl.class);
    }
}

我用注释解决了我的问题。引自javadoc:

与一起使用时,用@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);
}

谢谢你的帮助。我发现正在使用
@AssistedInject
。感谢您的帮助。我发现正在使用
@AssistedInject