2015-07-21 21 views
7

我想解决如何在Play Framework 2.4中使用依赖注入。我熟悉一般原则,但并不真正了解对设计的影响。我的一般推理是,控制器类中的静态方法与使用全局变量类似,并且很容易导致线程安全等问题,而且总体上鼓励糟糕的设计。因此,由于Play现在鼓励切换到依赖注入,所以我应该切换。玩框架java依赖项注入 - 何时使用singletons

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

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

回答

6

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

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

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

是否有特定的对象类型(例如,控制器?),应该是单身,以及是否有性能问题不标记对象为单身?

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

来到你的问题时使用@Singleton,因为(source)经验法则:

  • 状态的对象,如配置或计数器
  • 对象是昂贵的建造或查找
  • 捆绑资源的对象,如数据库连接池。

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

+1

谢谢 - 这就是我所需要的。我发现你链接到的“范围”页面非常有用。Play文档中为什么“单身人士”被突出显示或者还有其他选项对我来说并不明显 - 这更有意义。 – myrosia

+0

经过多一点研究后,一个潜在的警告:“范围”Guice页面讨论了请求范围和会话范围,但尽我所知,Play不支持这些,因为它不使用Google的servlet容器实现,也不会目前提供自己的。所以在这个意义上,文档页面可能会产生误导,因为它没有阐明实现依赖关系。 – myrosia