2

我正在使用依赖注入 Google Guice 框架开发一个项目。

在 Guice 中,可以将类与单例范围绑定为:

bind(Foo.class).to(FooImpl.class).in(Scopes.SINGLETON);

如果FooImpl类本身是一个真正的单例类:

public class FooImpl implements Foo{
    public static final FooImpl INSTANCE = new FooImpl();
    public static FooImpl getInstance(){...}
    // ...
}

或者

public class FooImpl implements Foo{
    private FooImpl instance = null;

    private FooImpl(){...}
    public static FooImpl getInstance(){
         if(instance == null)
             instance = new FooImpl();
         return FooImpl();
         // ...
    }

    // ...
}

因此,可以在项目中声明两个单例,第一个由 Guice 声明,第二个由getInstance()传统方式声明。

Google Guice 还可以使用该toInstance()方法将接口绑定到特定实例。

因此,在 Java 中使用以下声明来绑定 Singleton,而不应该是绑定 Singleton 的更好方法:

bind(Foo.class).toInstance(FooImpl.getInstance());

而不是第一个?它更安全吗?是否有可能以这种方式拥有两个单例实例?

使用 Google Guice 声明单例的最佳方式是什么?

4

1 回答 1

4

您建议的第一种方法是首选:

bind(Foo.class).to(FooImpl.class).in(Scopes.SINGLETON);

这允许 GuiceFooImpl根据需要执行依赖注入。使用您上次建议的方法手动绑定到实例时,这是不可能的。toInstance()

最后,Singleton 设计模式是一种反模式,原因有很多。注意这里指的是使用getInstance()等的实现;在您的应用程序的生命周期内拥有一个类的单个实例(如 GuiceSINGLETON范围内的对象)无论如何都不错

另请参阅Guice 关于范围的页面,了解单例范围的一些使用指南。

于 2012-06-01T19:56:10.180 回答