【问题标题】:How to test Guice Singleton?如何测试 Guice Singleton?
【发布时间】:2010-05-22 07:21:29
【问题描述】:

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)

如何将模块传递给它进行测试?

【问题讨论】:

  • 我不同意你问题的前提!您是否阅读过 Guice 用户指南?

标签: java unit-testing singleton module guice


【解决方案1】:

使用 Guice 时,您应该为每个 JVM 创建一个注入器。通常,您将在应用程序的入口点(即在您的public static void main 方法中)创建它。如果你在你的应用程序中多次调用createInjector,你可能是用错了Guice!

单例是每个注入器的实例。请注意,这是 not 每个 JVM 的实例。获得对单例的引用的最好方法是注入它。另一种方法是要求唯一的注入器实例将其提供给您。

【讨论】:

  • 假设我的 jvm 中需要两个注入器,这会给我带来麻烦吗?
  • 不同模块可以有多个createInjector吗?
  • 对于那些询问创建多个注入器和不同模块的人,是的,你可以。我有一个独特的情况,我正在与遗留代码集成并且没有可用的 DI。我的每个系统插件都有自己的注入器。如果我需要跨注入器的单例,我创建一个老式单例模块,我的模块通过它自己的注入器提供单例类。
【解决方案2】:

在做出这样疯狂、不准确的指控之前,您确实需要做更多的测试(和阅读)。我使用 Guice 来管理我的单例实例就好了。

您的模块绑定是什么样的? GoF 中的单例模式只是确保有一个类的一个实例的一种方式,但使用static 使其实际上是一个糟糕的选择。对单例的需求是在应用程序运行时只有一个类的实例可用。

以下是使用 Guice 创建单例实例所需的全部内容:

public class myModule extends AbstractModule {
    protected void configure() {
        bind(Service.class).to(ServiceImpl.class).in(Singleton.class);
    }
}

当您要求 Guice 为您提供实例时,您将获得相同的实例,除非您自己进行一些独特的范围界定。默认情况下,单例将用于当前的 Injector 实例。

【讨论】:

  • 我不同意,我认为 Guice 静态保存引用(因为他们总是在页面上的视频中创建新的注入器)
  • 事实上,Guice 不是这样工作的。 Guice 只参与对象创建和连接对象依赖关系图的过程。一旦发生这种情况,它就会消失。没有“静态”单例——它只是传递给使用它或需要它的不同实例的同一个对象引用。静态概念是一种直接使用语言的方式,DI 通过允许相同的事情来解决语言的“缺点”,而无需使用静态状态。
  • 他说的并没有错。注入器之间不共享单例。如果您创建两个单独的注入器并从它们中的任何一个请求一个单例范围的对象,它们将是不同的对象。此外,您的最后一条语句不正确默认情况下,单例将用于当前 Injector 实例而不是 vm 实例。
猜你喜欢
  • 2013-07-09
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 1970-01-01
  • 1970-01-01
  • 2015-04-28
相关资源
最近更新 更多