在 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);
}

别忘了相关的导入。在使用它之前一定要阅读文档以了解它是如何工作的。希望这会有所帮助:)