播放框架java依赖注入 - 何时使用单例

时间:2015-07-21 17:57:42

标签: java dependency-injection singleton playframework-2.4

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

我感到困惑的是在这种背景下的良好做法。当我阅读Play官方文档时,它会简要介绍依赖注入,然后及时提到@Singleton注释。并且可用的示例(http://www.typesafe.com/activator/template/play-guice)讨论了单例" WelcomeTextGenerator"上课也是如此。

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

1 个答案:

答案 0 :(得分:6)

  

所以我想知道,我应该使用单例对象,因为这些示例似乎意味着什么?如果是这种情况,与旧的静态方法方法相比有什么优势?

依赖注入是一种将应用程序连接在一起的技术。您编写的组件并不直接相互依赖。而是将组件注入彼此。这样,您只需交换应用程序的整个部分,而无需触及任何一行代码。在编写单元测试时,依赖注入特别有用。

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

  

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

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

根据经验(source)提出何时使用@Singleton的问题:

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

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