获得相同类型的多个guice单身人士

时间:2009-08-03 11:53:40

标签: java dependency-injection guice

你能得到2个相同底层类型的单例实例吗?

这在春天显然是微不足道的,因为它基于你附加范围的命名实例,但我看不到guice中的等价物,它是关于实现类的绑定类型。请注意,我不想绑定到实例,因为有问题的实例会被guice注入其他依赖项。

2 个答案:

答案 0 :(得分:16)

Guice也很容易!创建两个招标注释,例如@One@Two,然后

bind(MySingleton.class).annotatedWith(One.class).toInstance(new MySingleton());
bind(MySingleton.class).annotatedWith(Two.class).toInstance(new MySingleton());

然后

@Inject
public SomethingThatDependsOnSingletons(@One MySingleton s1,
    @Two MySingleton t2) { ... }

答案 1 :(得分:15)

我想补充Marcin的回应,并补充说在这种情况下你不必限制自己使用toInstance()或提供者方法。

以下内容同样适用:

bind(Person.class).annotatedWith(Driver.class).to(MartyMcFly.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(DocBrown.class).in(Singleton.class);

[...]

@Inject
public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... }

在实例化MartyMcFly和DocBrown类时,Guice会像往常一样注入依赖项。


请注意,当您想要绑定相同类型的多个单例时,它也有效:

bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class);

为了使其正常工作,您必须确保Person未在单一作用域范围内绑定,可以在Guice模块中明确地绑定,也可以使用@Singleton注释。 this Gist中的更多详细信息。

编辑: 我作为示例提供的示例代码来自Guice Grapher Test。 查看Guice测试是更好地了解如何使用API​​的好方法(这也适用于具有良好单元测试的每个项目)。