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

Jac*_*cko 1 guice

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

class MyComponent {
Run Code Online (Sandbox Code Playgroud)

我可以在应用程序启动时成功地让 Guice 实例化它,我希望它立即可用,也可以作为单身人士使用。这有效:-

bind(classOf[MyComponent]).asEagerSingleton
Run Code Online (Sandbox Code Playgroud)

我的问题是 -> 我是否需要在类上添加注释,还是在这种情况下它是多余的?

@Singleton
class MyComponent {
Run Code Online (Sandbox Code Playgroud)

pan*_*adb 5

简短回答:不 - 在这种情况下您不需要 Singleton 注释。bean 将是一个单例。但是,请继续阅读以了解为什么这不一样。

更长的答案:

这在一定程度上取决于您的用例。首先:

Singleton != EagerSingleton 
Run Code Online (Sandbox Code Playgroud)

绑定时会实例化一个急切的单例。一旦从 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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这输出:

Constructor called
Start
test.guice.SingletonTest$Test@44c8afef
test.guice.SingletonTest$Test@44c8afef
Run Code Online (Sandbox Code Playgroud)

如果你不将它绑定为eager singleton,它仍然是一个singleton,但是当你在这里请求实例时会调用构造函数:

Test instance = createInjector.getInstance(Test.class);
Run Code Online (Sandbox Code Playgroud)

绑定为单例,或注释为单例具有相同的效果。

注意:您没有急切的单例注释,尽管有添加该功能的框架。

现在为什么要使用注释?许多框架正在切换到 bean 发现。这意味着,您最终可以消除模块并让 Guice 简单地扫描您的 bean。

现在,如果您在模块中定义了绑定,则必须遍历它们并注释您的类。如果您忘记了一些,您的代码可能无法工作。

如果您使用正确的注释对它们进行注释,您将能够使用类路径扫描(或类似机制)来实例化您的对象。

使用单例绑定/和或注释运行我的测试代码会产生匹配的输出。因此,作为单例的绑定和使用单例注释的 bean 的行为是相同的。