为什么在play 2.5中使用单例控制器?

use*_*470 9 controller playframework

我刚刚开始,我不认为我理解得很好.据我所知,所有控制器都是在创建路由器时创建的依赖项.然后它们继续运行,直到应用程序终止时路由器终止.如果是这种情况,则宣称它们似乎是多余的.

Jac*_*cko 12

摆脱全局状态(这违背了无状态设计的想法)播放引入DI(我认为在v2.4左右)和v2.5中它现在默认使用注入路由器.Google Guice是Play打包的默认DI框架(您可以使用其他框架,但Guice是默认设置).

现在(总的来说)Guice认为创建Controller的新实例比使用单例更快,更安全 - 请参阅Guice文档了解更多信息.

如果您需要将控制器的实例限制为仅1,那么您可以将其标记为单例,但必须使其成为线程安全的,因为它将在线程之间共享.

我认为Activator模板可以使用更多的文档来解释为什么它们似乎@Singleton在它们似乎不需要时会生成控制器,因为它令人困惑.HomeController(例如,在Play-Scala种子中)@Singleton当它没有表现出任何情况时,会引起混淆.

一般情况下,@Singleton除非您对不变性和线程安全性有一个公平的理解,否则最好不要使用.如果你认为你有一个Singleton的用例,只是确保你保护任何共享状态.

简而言之,不要使用@Singleton.