根据要注入的对象注入值

时间:2014-11-03 10:53:03

标签: java servlets dependency-injection guice

我有以下情况:

public class InjectionTest {
    private static class Sub {
        @Inject private final String value = null;
    }
    private static class General {
        @Inject private final Sub sub = null;
    }
    private static class MainOne {
        @Inject private final General general = null;
    }
    private static class MainTwo {
        @Inject private final General general = null;
    }
    public static void main(String... arguments) {
        Injector injector = Guice.createInjector(new AbstractModule() {
            @Override protected void configure() {
                /* DO MAGIC */
            }
        });
        MainOne mainOne = injector.getInstance(MainOne.class);
        MainTwo mainTwo = injector.getInstance(MainTwo.class);
        assertThat(mainOne.general.sub.value, is("one"));
        assertThat(mainTwo.general.sub.value, is("two"));
    }
}

我希望value的实例可以MainOne访问"one"value实例访问MainTwo "two" Named }。我尝试过以下方法:

  • 使用Guice的General注释;遗憾的是,这需要我自己创建Sub实例或使用子注入器来创建Scope个实例。
  • 使用Guice的GuiceServletContextListener机制。我无法真正按照我想要的方式工作,并且感觉它从来没有打算这样做,事实上甚至根本不能这样做。

(当然真实场景更复杂,一如既往:我有一个ServletModule和一个Servlet,我试图在所有创建的{{1}中重用几个类/服务实例,但也需要从servlet请求的几个专用模块。)

我错过了什么吗?是否有(相对)简单的方法来实现我想要的目标?

1 个答案:

答案 0 :(得分:2)

首先,您不应该注入最终字段(请参阅注释)。我建议您删除final修饰符,或使用构造函数注入。

可以通过使用私有模块来解决您的示例。但我不认为这是一个“简单”的解决方案。

    Injector injector = Guice.createInjector(new PrivateModule() {
        @Override
        protected void configure() {
            bind(String.class).toInstance("one");
            bind(MainOne.class);

            expose(MainOne.class);
        }
    }, new PrivateModule() {
        @Override
        protected void configure() {
            bind(String.class).toInstance("two");
            bind(MainTwo.class);

            expose(MainTwo.class);
        }
    });

我认为您最好使用@Named或创建自己的绑定注释。

另请阅读“机器人腿”问题的维基页面: https://github.com/google/guice/wiki/FrequentlyAskedQuestions#how-do-i-build-two-similar-but-slightly-different-trees-of-objects