在 Java 中注入多个参数相同的接口
Inject Multiple Parameters Same interface in Java
我必须处理多个解析器(不相关)。我怎样才能正确注入以便 StepProcessor 可以接收所有 classes?我的 class 是:
@Inject
public StepProcessor(IParser... parsers) {
if (parsers == null) {
throw new IllegalArgumentException("Parsers cannot be null");
}
this.parsers = parsers;
}
@Override
public void process( String name ) {
for (IParser parser : parsers) {
System.out.println(parser.getName());
}
}
我如何注射?:
public class BasicModule extends AbstractModule {
@Override
protected void configure() {
bind(IParser.class).to(XmlParser.class);
bind(IParser.class).to(JsonParser.class);
bind(IParser.class).to(TextParser.class);
bind(IStepProcessor.class).to(StepProcessor.class);
}
}
我得到:
com.google.inject.CreationException:无法创建注入器,看到以下错误:
1) 已在 BasicModule.configure(BasicModule.java:7) 配置了对 IParser 的绑定。
在 BasicModule.configure(BasicModule.java:8)
我的用法:
Injector injector = Guice.createInjector(new BasicModule());
IStepProcessor comms = injector.getInstance(IStepProcessor.class);
comms.process("name");
您可以使用 Guice 中名为 MultiBinding 的东西来实现这一点。
@Inject
public StepProcessor(Set<IParser> parsers) { //Inject a set of IParser
if (parsers == null) {
throw new IllegalArgumentException("Parsers cannot be null");
}
this.parsers = parsers;
}
@Override
public void process( String name ) {
for (IParser parser : parsers) {
System.out.println(parser.getName());
}
}
现在将你的模块改成这个。
public class BasicModule extends AbstractModule {
@Override
protected void configure() {
MultiBinder<IParser> iParserBinder = MultiBinder.newSetBinder(binder(), IParser.class);
iParserBinder.addBinding().to(XmlParser.class);
iParserBinder.addBinding().to(JsonParser.class);
iParserBinder.addBinding().to(TextParser.class);
iParserBinder.addBinding().to(StepProcessor.class);
}
别忘了相关的导入。在使用它之前一定要阅读文档以了解它是如何工作的。希望这会有所帮助:)
我必须处理多个解析器(不相关)。我怎样才能正确注入以便 StepProcessor 可以接收所有 classes?我的 class 是:
@Inject
public StepProcessor(IParser... parsers) {
if (parsers == null) {
throw new IllegalArgumentException("Parsers cannot be null");
}
this.parsers = parsers;
}
@Override
public void process( String name ) {
for (IParser parser : parsers) {
System.out.println(parser.getName());
}
}
我如何注射?:
public class BasicModule extends AbstractModule {
@Override
protected void configure() {
bind(IParser.class).to(XmlParser.class);
bind(IParser.class).to(JsonParser.class);
bind(IParser.class).to(TextParser.class);
bind(IStepProcessor.class).to(StepProcessor.class);
}
}
我得到: com.google.inject.CreationException:无法创建注入器,看到以下错误:
1) 已在 BasicModule.configure(BasicModule.java:7) 配置了对 IParser 的绑定。 在 BasicModule.configure(BasicModule.java:8)
我的用法:
Injector injector = Guice.createInjector(new BasicModule());
IStepProcessor comms = injector.getInstance(IStepProcessor.class);
comms.process("name");
您可以使用 Guice 中名为 MultiBinding 的东西来实现这一点。
@Inject
public StepProcessor(Set<IParser> parsers) { //Inject a set of IParser
if (parsers == null) {
throw new IllegalArgumentException("Parsers cannot be null");
}
this.parsers = parsers;
}
@Override
public void process( String name ) {
for (IParser parser : parsers) {
System.out.println(parser.getName());
}
}
现在将你的模块改成这个。
public class BasicModule extends AbstractModule {
@Override
protected void configure() {
MultiBinder<IParser> iParserBinder = MultiBinder.newSetBinder(binder(), IParser.class);
iParserBinder.addBinding().to(XmlParser.class);
iParserBinder.addBinding().to(JsonParser.class);
iParserBinder.addBinding().to(TextParser.class);
iParserBinder.addBinding().to(StepProcessor.class);
}
别忘了相关的导入。在使用它之前一定要阅读文档以了解它是如何工作的。希望这会有所帮助:)