Guice:根据所有者的注射方式改变注射类型

时间:2009-08-02 18:49:15

标签: dependency-injection guice

我有一个基于guice的应用程序,现在需要给定类型的多个实例,所以我打算使用命名注释来消除依赖关系的歧义。然而,这种类型的依赖性也需要根据我获得的依赖性而变化。

举例说明我有

@Singleton
public class FooCache {
    private final FooCacheListener listener;
    @Inject 
    public FooCache(FooCacheListener listener) {
        this.listener = listener;
    }
    // do stuff
}

然后让我说我需要2个单独的实例,所以我可能有

@ThatOne FooCache

在一个班级和

@ThisOne FooCache
另一个。

现在假设我想在每种情况下都有一个不同的监听器(可能一个写入数据库,另一个通过JMS或某个分布式缓存发送通知)。我该怎么办?我无法看到我可以在FooCacheListener上添加一个名字,因为在一种情况下我需要一个不同的名字而另一种情况我在这里只有一个地方。我能想到这样做的唯一方法是通过子类化FooCache,但这对我来说似乎是一种非常笨拙的方法。

干杯 马特

1 个答案:

答案 0 :(得分:2)

您可以使用PrivateModules。转到here并向下滚动到如何构建两个相似但略有不同的对象树?这是一种让同一个类有两个不同实例的方法,听起来几乎就是你的正在努力做到。你可以传入cachelisteners而不是传递示例中传入的“lefty”和“righty”。 如果它看起来像你想要的那样,那里有更多的细节链接。

另一个选择可能是注入一个工厂,这也在上面的链接中讨论,问题如何通过Guice创建对象时传递参数?