如果与 asEagerSingleton 绑定,我需要 @Singleton 吗?
Do I need @Singleton if bound with asEagerSingleton?
我有一个组件要由 Guice 管理:-
class MyComponent {
我可以成功地让 Guice 在应用程序启动时实例化它,我希望它立即可用并且还可以作为单例使用。这有效:-
bind(classOf[MyComponent]).asEagerSingleton
我的问题是 -> 我是否需要 class 上的注释,或者在这种情况下是否多余?
@Singleton
class MyComponent {
简短回答:不 - 在这种情况下您不需要 Singleton 注释。该 bean 将是一个单例。但是,请继续阅读以了解为什么这不一样。
更长的答案:
这在一定程度上取决于您的用例。首先:
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);
绑定为单例,或者注解为单例效果相同。
注意:您没有急切的单例注释,尽管有添加该功能的框架。
现在为什么要使用注释?许多框架正在转向 bean 发现。这意味着,您最终可以消除模块并让 Guice 简单地扫描您的 bean。
现在,如果您在模块中定义了绑定,则必须遍历它们并注释您的 类。如果您忘记了一些,您的代码可能无法工作。
如果您为它们添加了正确的注解,您将能够使用类路径扫描(或类似机制)来实例化您的对象。
运行 我的带有单例 bindings/and 或注释的测试代码会产生匹配的输出。因此,作为单例的绑定和使用单例注释进行注释的 bean 的行为相同。
我有一个组件要由 Guice 管理:-
class MyComponent {
我可以成功地让 Guice 在应用程序启动时实例化它,我希望它立即可用并且还可以作为单例使用。这有效:-
bind(classOf[MyComponent]).asEagerSingleton
我的问题是 -> 我是否需要 class 上的注释,或者在这种情况下是否多余?
@Singleton
class MyComponent {
简短回答:不 - 在这种情况下您不需要 Singleton 注释。该 bean 将是一个单例。但是,请继续阅读以了解为什么这不一样。
更长的答案:
这在一定程度上取决于您的用例。首先:
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);
绑定为单例,或者注解为单例效果相同。
注意:您没有急切的单例注释,尽管有添加该功能的框架。
现在为什么要使用注释?许多框架正在转向 bean 发现。这意味着,您最终可以消除模块并让 Guice 简单地扫描您的 bean。
现在,如果您在模块中定义了绑定,则必须遍历它们并注释您的 类。如果您忘记了一些,您的代码可能无法工作。
如果您为它们添加了正确的注解,您将能够使用类路径扫描(或类似机制)来实例化您的对象。
运行 我的带有单例 bindings/and 或注释的测试代码会产生匹配的输出。因此,作为单例的绑定和使用单例注释进行注释的 bean 的行为相同。