Play framework java 依赖注入 - 何时使用单例
Play framework java dependency injection - when to use singletons
我正在尝试研究如何在 Play Framework 2.4 中使用依赖注入。我熟悉一般原则,但并不真正理解对设计的影响。我的一般推理是,控制器 classes 中的静态方法太像使用全局变量了,这很容易导致线程安全等问题,而且通常会鼓励糟糕的设计。所以既然 Play 现在鼓励切换到依赖注入,我也应该切换。
我感到困惑的是在这种情况下什么是好的做法。当我阅读 Play 官方文档时,它简要介绍了依赖注入,然后立即提到了 @Singleton 注释。并且可用的示例 (http://www.typesafe.com/activator/template/play-guice) 也讨论了单例 "WelcomeTextGenerator" class。
所以我想知道,我是否应该像示例中暗示的那样使用单例对象?如果是这种情况,与旧的静态方法方法相比有什么优势?是否有特定的对象类型(例如,控制器?)应该是单例的,不将对象标记为单例是否会对性能产生影响?
So I am wondering, should I be using singleton objects as the examples seem to imply? If this is the case, what is the advantage compared to the old static methods approach?
依赖注入是一种将应用程序连接在一起的技术。您编写不直接相互依赖的组件。相反,您将组件相互注入。通过这种方式,您可以简单地交换应用程序的整个部分,而无需触及一行代码。依赖注入在编写单元测试时特别有用。
与静态方法相比,您可以使用所有花哨的 OOP 内容。问题基本上是“静态方法的缺点是什么?”
Are there specific object types (e.g., controllers?) that should be singletons, and are there performance implications to not marking objects as singletons?
Play 或更具体地说,只要默认注入依赖项,Guice 就会创建一个新对象。将它们标记为 @Singleton
将只创建一个对象,并在所有注入中重复使用完全相同的对象。也就是说:单例省去了一些对象的创建和垃圾回收,但是需要同步来初始化对象。
根据经验 (source) 来回答您何时使用 @Singleton
的问题:
- 有状态对象,例如配置或计数器
- 构造或查找成本高昂的对象
- 占用资源的对象,例如数据库连接池。
Guice 顺便提供了一个非常全面的 documentation。我强烈建议您浏览一下。
我正在尝试研究如何在 Play Framework 2.4 中使用依赖注入。我熟悉一般原则,但并不真正理解对设计的影响。我的一般推理是,控制器 classes 中的静态方法太像使用全局变量了,这很容易导致线程安全等问题,而且通常会鼓励糟糕的设计。所以既然 Play 现在鼓励切换到依赖注入,我也应该切换。
我感到困惑的是在这种情况下什么是好的做法。当我阅读 Play 官方文档时,它简要介绍了依赖注入,然后立即提到了 @Singleton 注释。并且可用的示例 (http://www.typesafe.com/activator/template/play-guice) 也讨论了单例 "WelcomeTextGenerator" class。
所以我想知道,我是否应该像示例中暗示的那样使用单例对象?如果是这种情况,与旧的静态方法方法相比有什么优势?是否有特定的对象类型(例如,控制器?)应该是单例的,不将对象标记为单例是否会对性能产生影响?
So I am wondering, should I be using singleton objects as the examples seem to imply? If this is the case, what is the advantage compared to the old static methods approach?
依赖注入是一种将应用程序连接在一起的技术。您编写不直接相互依赖的组件。相反,您将组件相互注入。通过这种方式,您可以简单地交换应用程序的整个部分,而无需触及一行代码。依赖注入在编写单元测试时特别有用。
与静态方法相比,您可以使用所有花哨的 OOP 内容。问题基本上是“静态方法的缺点是什么?”
Are there specific object types (e.g., controllers?) that should be singletons, and are there performance implications to not marking objects as singletons?
Play 或更具体地说,只要默认注入依赖项,Guice 就会创建一个新对象。将它们标记为 @Singleton
将只创建一个对象,并在所有注入中重复使用完全相同的对象。也就是说:单例省去了一些对象的创建和垃圾回收,但是需要同步来初始化对象。
根据经验 (source) 来回答您何时使用 @Singleton
的问题:
- 有状态对象,例如配置或计数器
- 构造或查找成本高昂的对象
- 占用资源的对象,例如数据库连接池。
Guice 顺便提供了一个非常全面的 documentation。我强烈建议您浏览一下。