Guice Singletons对我来说很奇怪
首先我想到了
IService ser = Guice.createInjector().getInstance(IService.class);
System.out.println("ser=" + ser);
ser = Guice.createInjector().getInstance(IService.class);
System.out.println("ser=" + ser);
将作为单身人士工作,但会返回
ser=Service2@1975b59
ser=Service2@1f934ad
没关系,它不一定非常容易。
Injector injector = Guice.createInjector();
IService ser = injector.getInstance(IService.class);
System.out.println("ser=" + ser);
ser = injector.getInstance(IService.class);
System.out.println("ser=" + ser);
作为单身人士
ser=Service2@1975b59
ser=Service2@1975b59
所以我需要有Injector的静态字段(Singleton for Singletons)
我如何传递给它进行测试?
答案 0 :(得分:12)
使用Guice时,每个JVM应该只创建一个注入器。通常,您将在应用程序的入口点(即在public static void main
方法中)创建它。如果您在应用程序中多次致电createInjector
,那么您可能错误地使用了Guice!
单身人士是每个注射器的实例。请注意,这是不 instance-per-JVM。获得单身人士参考的最佳方法是注入它。另一种方法是要求唯一的注射器实例给你。
答案 1 :(得分:0)
在做出类似的狂野,不准确的指控之前,你真的需要做更多的测试(和阅读)。我正在使用Guice来管理我的单例实例。
你的模块绑定是什么样的? GoF中的单例模式只是确保一个类的一个实例的一种方式,但使用static
使它实际上是一个糟糕的选择。对单例的需求是在应用程序运行时只有一个类的实例可用。
以下是使用Guice创建单例实例所需的全部内容:
public class myModule extends AbstractModule {
protected void configure() {
bind(Service.class).to(ServiceImpl.class).in(Singleton.class);
}
}
当您要求Guice为您提供实例时,除非您自己做一些独特的范围,否则您将获得相同的实例。默认情况下,单例将用于当前的Injector
实例。