我必须处理多个解析器(不相关)。如何正确注入,以便StepProcessor可以接收所有类?我的课是:
@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);
}
不要忘记相关的进口。在使用文档之前,请先阅读该文档以了解其工作原理。希望这会有所帮助:)