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

Mat*_*att 13 java dependency-injection guice

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

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

Mar*_*cin 16

Guice也很容易!创建两个招标注解,说@One@Two,然后

bind(MySingleton.class).annotatedWith(One.class).toInstance(new MySingleton());
bind(MySingleton.class).annotatedWith(Two.class).toInstance(new MySingleton());
Run Code Online (Sandbox Code Playgroud)

然后

@Inject
public SomethingThatDependsOnSingletons(@One MySingleton s1,
    @Two MySingleton t2) { ... }
Run Code Online (Sandbox Code Playgroud)

  • @Filip,我尝试了你的建议,并为两个注释收到了相同的实例.我使用`bind(MySingleton.class).annotatedWith(One.class).to(MySingleton.class).in(Singleton.class); 绑定(MySingleton.class).annotatedWith(Two.class).为了(MySingleton.class).在(Singleton.class);` (2认同)

Eti*_*veu 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);
Run Code Online (Sandbox Code Playgroud)

[...]

@Inject
public BackToTheFuture(@Driver Person marty, @Inventor Person doc) { ... }
Run Code Online (Sandbox Code Playgroud)

在实例化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);
Run Code Online (Sandbox Code Playgroud)

为了使其工作,您必须确保它Person不受单一范围的限制,无论是在Guice模块中是明确的还是与@Singleton注释一起.这个要点中的更多细节.

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