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

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

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

Guice也很容易! 创建两个@One注释,比如说@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) { ... } 

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

以下也适用:

 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注释。 这个要点中的更多细节。

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