【问题标题】:Guice Beginner - How to bind concrete classes - Singleton?Guice Beginner - 如何绑定具体类 - Singleton?
【发布时间】:2017-11-21 16:17:17
【问题描述】:

我想将一个类绑定到一个实例,但 Guice 不让我这样做,给了我 Binding points to its own 错误。我也希望实例是单例。

所以要提供更多背景信息。我有一个要绑定的类,但我不能,因为 bindClass 和 instanceClass 必须不同。

//This fails when bindClass==instanceClass
bind((bindClass)).to(instanceClass).in(Singleton.class);

有一个标题为“Guice Beginner - How to bind concrete classes”的问题可以在这里找到:

Guice Beginner - How to bind concrete classes?

公认的答案是不绑定,让“及时”绑定来完成这项工作。

但是,如果您想要实例的单例,该怎么做呢?

【问题讨论】:

    标签: java guice


    【解决方案1】:
    // eager singleton always
    bind(YourClass.class).asEagerSingleton();
    
    // eager in prod, lazy in dev
    bind(YourClass.class).in(Singleton.class);
    

    这与bind 语句的许多其他变体一起在Binder class-level docs 上列出:

    bind(ServiceImpl.class).in(Singleton.class);
    // or, alternatively
    bind(ServiceImpl.class).in(Scopes.SINGLETON);
    

    这些语句中的任何一个都将 ServiceImpl 类置于单例范围内。 Guice 将只创建一个 ServiceImpl 实例并将其重用于这种类型的所有注入请求。请注意,如果第二个绑定由上一个示例中的注释限定,则仍然可以绑定另一个 ServiceImpl 实例。 Guice 并不会过分担心阻止您创建“单例”的多个实例,只需要让您的应用程序仅共享一个实例,前提是您告诉 Guice 您需要这样做。

    虽然简单地用 @Singleton 标记类并依赖 JIT 绑定也可以,但在 Guice 验证您的图表和急切执行方面,将绑定放在模块中是有好处的初始化。这在服务器上下文中特别有用,因为您的初始化更有可能发生在您开始将实时流量重定向到新加载的服务器实例之前。

    Scopes wiki page 上查看有关急切/延迟单例加载的更多信息。

    【讨论】:

    • 听起来像我要找的东西。我明天会试一试,如果没有后续问题,我会将您的答案标记为已接受。非常感谢!
    猜你喜欢
    • 2012-01-19
    • 1970-01-01
    • 2022-09-09
    • 2013-07-09
    • 2013-03-13
    • 2021-07-23
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多