14

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

这在 spring 中显然是微不足道的,因为它基于您附加范围的命名实例,但我在 guice 中看不到关于将类型绑定到实现类的等价物。请注意,我不想绑定到实例,因为相关实例通过 guice 注入了其他依赖项。

4

2 回答 2

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) { ... }
于 2009-08-03T13:28:30.320 回答
16

我想补充 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没有绑定在 Singleton 范围内,无论是在 Guice 模块中还是在@Singleton注释中。本要点中的更多详细信息。

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

于 2009-09-10T21:06:02.867 回答