gon*_*ard 4 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 SimpleData(@Assisted @Nullable Path path) {
}
}
Run Code Online (Sandbox Code Playgroud)
我想Factory用guice 生成一个不同的方法.
import java.nio.file.Path;
import javax.annotation.Nullable;
public interface Factory {
Data create();
Data load(@Nullable Path path);
}
Run Code Online (Sandbox Code Playgroud)
但是以下模块配置:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
失败:
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)
Run Code Online (Sandbox Code Playgroud)
我使用注释解决了我的问题@AssistedInject.从javadoc引用:
与串联使用时
FactoryModuleBuilder,使用@AssistedInject注释的构造函数表示可以注入多个构造函数,每个构造函数具有不同的参数.
所以我将注释和构造函数添加到SimpleData类中:
public class SimpleData implements Data {
@AssistedInject
public SimpleData(@Assisted Path path) {
}
@AssistedInject
public SimpleData() {
}
}
Run Code Online (Sandbox Code Playgroud)
我从工厂删除了@Nullable注释:
import java.nio.file.Path;
public interface Factory {
Data create();
Data load(Path path);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5364 次 |
| 最近记录: |