java - Guice 根据父实例注解注入(inject)不同的实例

标签 java dependency-injection annotations guice assisted-inject

我在我的应用程序中使用 guice 框架。我有一个场景,其中单个类可能需要相同接口(interface) C 的多个实例(但出于不同目的),如示例所示。我正在尝试使用 guice 中的注释工具来解决这个问题。

如下例所示,我希望 ConcreteImpl 的配置也由 guice 注入(inject)。但问题是 type1、type2 和 type3 实例的配置可能不同。假设我有这些实例的先验配置,是否有一种工具可以根据请求配置的实例的上下文(由注释表示)注入(inject)它们?

    class A {
        @Inject
        public A(@Purpose1 C type1, @Purpose2 C type2, @Purpose3 C type3) {

        }
    }

    interface C {}

    class ConcreteImpl implements C {
        @Inject
        public ConcreteImpl(ConcreteImplConfig config) {}
    }

    class ConcreteImplConfig {
        String pty1;
        String pty2;
    }  

我的模块绑定(bind)是这样的——

    bind(C.class)
            .annotatedWith(Purpose1.class)
            .to(purpose1Cklass/**obtained from config**/);

    bind(C.class)
            .annotatedWith(Purpose2.class)
            .to(purpose2Cklass/**obtained from config**/);

    bind(C.class)
            .annotatedWith(Purpose3.class)
            .to(purpose3Cklass/**obtained from config**/);

这正是我想做的事情

    bind(ConcreteImplConfig.class)
            .requestedThrough(Purpose1.class)
            .toInstance(purpose1config);

    bind(ConcreteImplConfig.class)
            .requestedThrough(Purpose2.class)
            .toInstance(purpose2config);

    bind(ConcreteImplConfig.class)
            .requestedThrough(Purpose3.class)
            .toInstance(purpose3config);

我已经看过 assisted inject,它可以注入(inject)一个工厂,然后我们使用 factory.create(config) 但我不倾向于那样做,因为契约(Contract)往往会变得有点丑陋,而且我拥有更多配置在我的应用程序开始时应该能够注入(inject)它们。

最佳答案

这是 Robot Leg Problem .您需要创建一个 private module对于 C。

abstract class CModule extends PrivateModule {
    private final Class<? extends Annotation> annotation;

    CModule(Class<? extends Annotation> annotation) {
        this.annotation = annotation;
    }

    @Override protected void configure() {
        bind(C.class).annotatedWith(annotation).to(C.class);
        expose(C.class).annotatedWith(annotation);

        bindConfig();
    }

    abstract void bindConfig();
}

public static void main(String[] args) {
        Injector injector = Guice.createInjector(
                new CModule(Propsal1.class) {
                    @Override void bindConfig() {
                        bind(ConcreteImplConfig.class).toInstance(new ConcreteImplConfig());
                    }
                },
                new CModule(Propsal2.class) {
                    @Override void bindConfig() {
                        bind(ConcreteImplConfig.class).toInstance(new ConcreteImplConfig());
                    }
                },
                new CModule(Propsal2.class) {
                    @Override void bindConfig() {
                        bind(ConcreteImplConfig.class).toInstance(new ConcreteImplConfig());
                    }
                }
                );
    }

关于java - Guice 根据父实例注解注入(inject)不同的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35907270/

相关文章:

java - 创建新 Activity 错误: RED SQUIGGLYS EVERYWHERE

java - 如何在 GWT 中使用 java.util.Calendar

java - 如何仅为一个特定类创建新的 Spring bean,而不是为应用程序的其余部分创建 Singleton

java - Autowiring 接口(interface)无需注释即可工作

java - Magnolia 5.4.7 更改列排序

java - 多核对5ms处理页面的影响

spring - 如何使用 Spring 将依赖项注入(inject) HttpSessionListener?

java - Jersey/HK2 - 通过带注释的注入(inject)将 HttpServletRequest 注入(inject) ContainerRequestFilter 内

javax.validation.ConstraintDefinitionException : HV000074

java - 注释中不允许从伴生对象分配静态最终值