获取相同类型的多个 guice 单例
2022-09-03 17:49:25
你能得到2个相同底层类型的单例实例吗?
这在春季显然是微不足道的,因为它基于您附加作用域的命名实例,但我在guice中看不到等效的,这是关于将类型绑定到实现类的。请注意,我不想绑定到实例,因为有问题的实例是通过 guice 注入其他依赖项的。
你能得到2个相同底层类型的单例实例吗?
这在春季显然是微不足道的,因为它基于您附加作用域的命名实例,但我在guice中看不到等效的,这是关于将类型绑定到实现类的。请注意,我不想绑定到实例,因为有问题的实例是通过 guice 注入其他依赖项的。
我想补充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) { ... }
Guice 将在实例化 MartyMcFly 和 DocBrown 类时像往常一样注入依赖项。
请注意,当您想要绑定相同类型的多个单例时,它也有效:
bind(Person.class).annotatedWith(Driver.class).to(Person.class).in(Singleton.class);
bind(Person.class).annotatedWith(Inventor.class).to(Person.class).in(Singleton.class);
为此,必须确保 它未绑定在 Singleton 作用域中,无论是在 Guice 模块中显式绑定,还是在注释中。更多细节请见本要点。Person
@Singleton
编辑:我给出的示例代码来自Guice Grapher测试。查看 Guice 测试是更好地了解如何使用 API 的好方法(这也适用于每个具有良好单元测试的项目)。
在圭斯也很容易!创建两个出价注释,比如 说和,然后@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) { ... }