1

我有一个基于 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 ,但这对我来说似乎是一种非常笨拙的方法。

干杯马特

4

1 回答 1

2

您也许可以使用 PrivateModules。转到此处并向下滚动到如何构建两个相似但略有不同的对象树? 这是一种拥有同一类的两个不同实例的方法,这听起来几乎正是您想要做的。您可以传入缓存侦听器,而不是示例中传入的“lefty”和“righty”。如果它看起来像您想要的那样,还有更多包含详细信息的链接。

另一种选择可能是注入一个工厂,这也在上面的链接中讨论过,在问题How do I pass a parameter when creating an object via Guice?

于 2009-08-02T21:26:18.283 回答