在Java中注入多个参数相同的接口

问题描述 投票:0回答:1

我必须处理多个解析器(不相关)。如何正确注入,以便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");
java dependency-injection guice
1个回答
0
投票

您可以使用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);
}

不要忘记相关的进口。在使用文档之前,请先阅读该文档以了解其工作原理。希望这会有所帮助:)

© www.soinside.com 2019 - 2024. All rights reserved.