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

时间:2012-06-01 19:02:55

标签: java dependency-injection guice

我正在使用Depedency injection 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()方法将接口绑定到特定实例。

因此,相反使用Singleton范围进行绑定,在Java中使用此声明绑定Singleton是一种更好的方法:

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

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

使用Google Guice宣布单身人士的最佳方式是什么?

1 个答案:

答案 0 :(得分:4)

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

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

这允许Guice根据需要在FooImpl中执行依赖注入。使用toInstance()手动绑定到实例时,这可能

最后,Singleton设计模式is an anti-pattern for many reasons。请注意,这是指使用getInstance()等的实现;在应用程序的生命周期内拥有一个类的单个实例(如Guice的SINGLETON范围内的对象),无论如何都

另请参阅Guice's page on scopes了解单例范围的一些使用指南。