带有命名绑定的 Guice 多重绑定

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

我有一堆处理器。有些具有相同的对象类型但具有不同的配置。我想创建一组处理器,但选择哪个处理器应放入哪个组中。是否有办法使用多重绑定来做到这一点?

public class PostProcessorModule extends AbstractModule {

    public static final String TYPE_A = "TypeA";
    public static final String TYPE_B = "TypeB";

    @Override
    protected void configure() {
        Multibinder<PostProcessor> typeASet =
            Multibinder.newSetBinder(binder(), PostProcessor.class, Names.named("TypeASet"));
        typeASet.addBinding().to(RandomizationPostProcessor.class);  // Only want Type A 
here
        typeASet.addBinding().to(SecondPostProcessor.class);

        Multibinder<PostProcessor> typeBSet =
            Multibinder.newSetBinder(binder(), PostProcessor.class, Names.named("TypeBSet"));
        typeASet.addBinding().to(RandomizationPostProcessor.class);  // Only want Type B 
here
        typeASet.addBinding().to(SecondPostProcessor.class);
    }


    @Provides
    @Singleton
    @Named(TYPE_A)
    public RandomizationPostProcessor getRandomizationPostProcessorA() {

        return RandomizationPostProcessor.builder()
                   .toRandomize(3)
                   .build();
    }

    @Provides
    @Singleton
    @Named(TYPE_B)
    public RandomizationPostProcessor getRandomizationPostProcessorB() {

        return RandomizationPostProcessor.builder()
                   .toRandomize(10)
                   .build();
    }

    @Provides
    @Singleton
    public SecondPostProcessor getSecondPostProcessor() {

        return new SecondPostProcessor();
    }
}

public class Test {
    @Inject
    @Named("TypeASet")
    private final Set<PostProcessor> setA;
    
    @Inject
    @Named("TypeBSet")
    private final Set<PostProcessor> setB;

    public void doSomething() {
        ...
    }
}

RandomizationPostProcessor
SecondPostProcessor
实现
PostProcessor

多重绑定支持吗?我看不到任何像

annotatedWith
或普通
bind()
函数中具有的类似函数。编写另一个函数是创建自定义集的唯一方法吗?

java guice java-17
1个回答
0
投票

当然,您可以

addBinding
到特定键:

typeASet.addBinding().to(Key.get(RandomizationPostProcessor.class, Names.named(TYPE_A))
typeBSet.addBinding().to(Key.get(RandomizationPostProcessor.class, Names.named(TYPE_B))
© www.soinside.com 2019 - 2024. All rights reserved.