我有一个我希望由Guice管理的组件: -
class MyComponent {
我可以成功让Guice在app启动时实例化它,我希望它立即可用,也可以作为Singleton。这有效: -
bind(classOf[MyComponent]).asEagerSingleton
我的问题是 - >我需要在课堂上注释,还是在这种情况下是多余的?
@Singleton
class MyComponent {
答案 0 :(得分:2)
简短回答:不 - 在这种情况下你不需要Singleton注释。豆子将是一个单身人士。但是,请继续阅读以了解为何这不相同。
更长的答案:
这取决于你的用例。首先:
Singleton != EagerSingleton
绑定时会实例化一个急切的单例。一旦从guice请求实例,就会实例化单例。见这个例子:
public class SingletonTest {
public static void main(String[] args) {
Injector createInjector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure() {
bind(Test.class).asEagerSingleton();
}
});
System.out.println("Start");
Test instance = createInjector.getInstance(Test.class);
System.out.println(instance);
Test instance2 = createInjector.getInstance(Test.class);
System.out.println(instance2);
}
public static class Test {
public Test() {
System.out.println("Constructor called");
}
}
}
输出:
Constructor called
Start
test.guice.SingletonTest$Test@44c8afef
test.guice.SingletonTest$Test@44c8afef
如果你不将它绑定为渴望的单例,它仍然是一个单例,但是当你在这里请求实例时会调用构造函数:
Test instance = createInjector.getInstance(Test.class);
绑定为单例,或注释为Singleton具有相同的效果。
注意:虽然有一些框架可以添加该功能,但您没有热切的单例注释。
现在为什么要使用注释?许多框架正在转向bean发现。这意味着,您最终可以消除模块并让Guice只扫描您的bean。
现在,如果您在模块中定义了绑定,则必须通过它们并注释您的类。如果你忘了一些,你的代码可能无法正常工作。
如果您使用正确的注释对其进行注释,则可以使用类路径扫描(或类似机制)来实例化对象。
使用单例绑定/和/或注释运行我的测试代码会导致匹配输出。因此,作为单例的绑定和使用单例注释注释的bean的行为相同。