问题描述
使用注释的类必须遵循吗?
我的猜测是它们没有:没有必要使用私有构造函数和static .instance()
方法,而是Guice确保只实例化该类的一个实例。
1楼
他们不仅不需要遵循Singleton模式,他们明确地不应该遵循它 。
使用Guice正确设置的系统应该尽可能少地创建自己的对象,而不是让框架完成所有对象的创建。
此外,您不希望系统中的随机类在此静态实例上调用.instance()
,最后,您不希望Guice使用.requestStaticInjection()
在Singleton类中创建静态引用。
使用@Singleton
类正确的做法是将它们注入需要特定依赖项的类中。
2楼
Guice中的单例与常规单例之间的区别与上下文有关。
当你不使用Guice时,你必须自己管理你的单身人士。 要确保只创建一个实例,您将拥有一个私有构造函数,一个静态字段和访问此实例的方法(getter或使字段成为final)。 这意味着实例是类加载器上下文中的单例。 如果您创建另一个类加载器并告诉它加载您的单例类,您可以创建第二个实例。
当单例由Guice管理时,我们用@Singleton
注释替换私有构造函数和静态字段,告诉注入器它应该只创建该类的一个实例并在请求的任何地方使用它。
由于可以同时使用多个注入器(因为您需要两个完全不同的上下文或者因为您使用的是子注入器),因此您不能阻止Guice实例化您的类的多个实例。
此外,由于您应该依赖Guice在任何地方提供单例,因此不需要包含单例实例的静态字段,因为永远不应该访问它。