Dependency injection Guice:根据所有者被注入的方式改变注入的类型

Dependency injection Guice:根据所有者被注入的方式改变注入的类型,dependency-injection,guice,Dependency Injection,Guice,我有一个基于guice的应用程序,现在需要给定类型的多个实例,因此我计划使用命名注释来消除依赖关系的歧义。然而,这种类型的依赖项也需要根据我得到的依赖项而有所不同 为了举例说明,让我们假设我有 @Singleton public class FooCache { private final FooCacheListener listener; @Inject public FooCache(FooCacheListener listener) { thi

我有一个基于guice的应用程序,现在需要给定类型的多个实例,因此我计划使用命名注释来消除依赖关系的歧义。然而,这种类型的依赖项也需要根据我得到的依赖项而有所不同

为了举例说明,让我们假设我有

@Singleton
public class FooCache {
    private final FooCacheListener listener;
    @Inject 
    public FooCache(FooCacheListener listener) {
        this.listener = listener;
    }
    // do stuff
}
然后假设我需要两个单独的实例,所以我可能需要

@ThatOne FooCache
一堂课

@ThisOne FooCache
另一方面

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

干杯
Matt

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


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

不知为什么我在文档中遗漏了这一点,这就是我要寻找的。谢谢