我正在使用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宣布单身人士的最佳方式是什么?
答案 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了解单例范围的一些使用指南。