我的问题是关于 Java Play 框架中控制器的生命周期,控制器是有状态实例还是具有静态方法的无状态,以及如何在控制器代码中使用依赖注入。
每个 Web 请求是否由 Play 控制器类的新实例处理,即控制器可以将状态存储在注入到控制器构造函数中的服务等字段中吗?(在文档中的哪里解释了?)
Play 框架自早期版本(如果是,在哪个版本?)之后是否发生了关于控制器是有状态实例还是具有静态方法的无状态控制器的变化?
在哪里可以看到有关框架如何在使用有状态控制器时将服务注入控制器实例的代码示例以及如何将服务注入静态控制器方法的示例?
关于后者,即注入静态方法,我想这要么必须是框架将添加的方法的参数,要么如果不可能,您可能不得不在方法中使用服务定位器,例如实例化一个Guice 模块类,然后在静态控制器方法中使用“injector.getInstance”。
这个主题在下一页的“依赖注入控制器”部分中有所涉及:
https://www.playframework.com/documentation/2.4.x/JavaDependencyInjection
但是,它没有用代码显示如何将服务实际注入控制器实例(但可能与其他“组件”的方式相同,即使用 @Inject 注释),当然它当前没有显示如何将 DI 与静态控制器方法一起使用.
我对这些事情感到困惑,因为我没有找到明确说明我的问题的文档,而且我还在 Play book(从 2013 年开始)中读到控制器方法应该被编程为无状态,控制器方法应该是静态的。
但是,当现在使用激活器为 Java 的最新 Play 版本 (2.4.6) 生成 Play 应用程序时,我可以看到生成的 Controller 方法 (Application.index) 不是静态的。此外,在以下文档页面中,控制器方法不是静态的:https : //www.playframework.com/documentation/2.4.x/JavaActions
这是令人困惑的,因为了解每个请求是否由 Controller 实例处理(即是否可以使用状态)非常重要,我认为这应该在关于 Controller/Actions 的页面上比当前更好地记录没有解释它的文档(上面链接的页面)。
关于依赖注入的文档在提到“静态路由生成器”的“依赖注入控制器”部分涉及静态和非静态方法的主题,但我认为应该更好地解释包括代码示例。
如果 Play 团队中的某个人正在阅读此问题,那么请在上述链接页面中添加一些信息,例如请提及(如果我的理解是正确的)在 Play 的先前版本中,控制器方法是静态的,对于这些版本,您永远不应该在字段中存储状态,但在以后的版本中(从版本 x 开始?)每个请求都由控制器的实例处理,因此可以使用状态(例如,框架注入的构造函数参数)。
还请提供有关与静态控制器方法一起使用的注入以及每个请求一个实例注入有状态控制器实例的代码示例。
依赖注入页面中的“组件生命周期”部分只提到了“组件”,但我认为它也应该明确说明控制器生命周期及其注入,因为与所有开发人员清楚地沟通以避免错误是一个如此基本和重要的知识由对是否有状态的误解引起的。
我是PlayFramework的新手.
请给我一个示例,了解如何从我的视图中访问配置参数.我正在使用PlayFramework 2.5.3
旧方式(@current已弃用):
@current.configuration.getString("environment.param")
Run Code Online (Sandbox Code Playgroud)
新方法(据我所知,应该注入配置):
我知道如何从控制器访问它.
@Inject() (val messagesApi: MessagesApi, configuration: Configuration)
Run Code Online (Sandbox Code Playgroud)
我如何在我看来使用它?