如果与asEagerSingleton绑定,我是否需要@Singleton?

时间:2016-09-14 15:02:08

标签: guice

我有一个我希望由Guice管理的组件: -

class MyComponent {

我可以成功让Guice在app启动时实例化它,我希望它立即可用,也可以作为Singleton。这有效: -

bind(classOf[MyComponent]).asEagerSingleton

我的问题是 - >我需要在课堂上注释,还是在这种情况下是多余的?

@Singleton
class MyComponent {

1 个答案:

答案 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的行为相同。