两个具有依赖注入的单例实例(Google Guice)

问题描述 投票:0回答:1

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

可以将类与单例作用域绑定,在 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 声明单例的最佳方式是什么?

java dependency-injection guice
1个回答
4
投票

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

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

这允许 Guice 根据需要在

FooImpl
中执行依赖注入。当使用 toInstance() 手动绑定到实例(如您上一个建议中所示)时,这是不可能的。
最后,单例设计模式

由于多种原因

是一种反模式。注意,这是指使用getInstance()等实现;在应用程序的生命周期中拥有一个类的单个实例(就像 Guice

SINGLETON
范围中的对象)无论如何都
不错
不好。 另请参阅

Guice 关于范围的页面

,了解单例范围的一些使用指南。

© www.soinside.com 2019 - 2024. All rights reserved.