【问题标题】:Play framework java dependency injection - when to use singletons播放框架java依赖注入-何时使用单例
【发布时间】:2015-10-11 08:04:46
【问题描述】:

我正在尝试研究如何在 Play Framework 2.4 中使用依赖注入。我熟悉一般原则,但并不真正了解设计的含义。我的一般推理是,控制器类中的静态方法太像使用全局变量了,这很容易导致线程安全等问题,而且通常会鼓励糟糕的设计。所以既然 Play 现在鼓励切换到依赖注入,我也应该切换。

我感到困惑的是,在这种情况下,好的做法是什么。当我阅读 Play 官方文档时,它简要介绍了依赖注入,然后立即提到了 @Singleton 注释。并且可用示例 (http://www.typesafe.com/activator/template/play-guice) 也谈到了单例“WelcomeTextGenerator”类。

所以我想知道,我是否应该像示例所暗示的那样使用单例对象?如果是这种情况,与旧的静态方法方法相比有什么优势?是否存在应该是单例的特定对象类型(例如控制器?),以及不将对象标记为单例是否会影响性能?

【问题讨论】:

    标签: java dependency-injection singleton playframework-2.4


    【解决方案1】:

    所以我想知道,我是否应该像示例所暗示的那样使用单例对象?如果是这种情况,与旧的静态方法方法相比有什么优势?

    依赖注入是一种将应用程序连接在一起的技术。您编写不直接相互依赖的组件。相反,您将组件相互注入。通过这种方式,您可以简单地交换应用程序的整个部分,而无需触及任何一行代码。依赖注入在编写单元测试时特别有用。

    与静态方法相比,您可以使用所有花哨的 OOP 东西。问题基本上是“静态方法有什么缺点?

    是否存在应该是单例的特定对象类型(例如控制器?),以及不将对象标记为单例是否会影响性能?

    Play 或者更具体地说 Guice 将在默认情况下在注入依赖项时创建一个新对象。将它们标记为@Singleton 将只创建一个对象,并在所有注入中重复使用完全相同的对象。换句话说:Singleton 节省了一些对象创建和垃圾回收,但需要同步来初始化对象。

    根据经验 (source) 来回答您何时使用 @Singleton 的问题:

    • 有状态的对象,例如配置或计数器
    • 构建或查找成本高昂的对象
    • 占用资源的对象,例如数据库连接池。

    顺便说一句,Guice 提供了一个非常全面的documentation。我强烈建议浏览一段时间。

    【讨论】:

    • 谢谢 - 这正是我所需要的。我发现您链接到的“范围”页面非常有用。从 Play 文档中我并不清楚为什么要突出显示“单例”,或者还有其他选项 - 这更有意义。
    • 经过更多研究,一个潜在的警告:“范围”Guice 页面讨论了请求范围和会话范围,但据我所知,Play 不支持这些,因为它不使用Google 的 servlet 容器实现,目前不提供自己的。所以从这个意义上说,文档页面可能会产生误导,因为它没有阐明实现依赖关系。
    猜你喜欢
    • 2021-12-27
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2015-07-18
    相关资源
    最近更新 更多