启动播放应用程序时代码的入口点

Entry point of the code when starting a play application

这是我编写的第一个 Web 应用程序,所以也许这个问题对你们中的一些人来说很明显,但我没有在 play 网站上找到任何东西。查看入门应用程序时,代码的一部分如下所示:

package controllers

import javax.inject._
import play.api._
import play.api.mvc._

@Singleton
class HomeController @Inject()(val controllerComponents: ControllerComponents) extends BaseController {
  def index() = Action { implicit request: Request[AnyContent] =>
    Ok(views.html.index())
  }
}

所以,现在我想知道,我的 controllerComponents 是从哪里来的?我的申请从哪里开始?通常,我可以寻找我的 main 方法或 extends App 但在这里我真的不知道这个方法在哪里或在起作用,一般来说,我从中获得我的价值。

简短的回答 - Play Framework 应用程序中没有公开 main 方法。它对开发人员是隐藏的,因此框架会为您完成所有应用程序启动工作:依赖注入连接、外部资源创建(例如 slick 或其他可插入资源的数据库连接)、端口监听启动等。这种方法也为人所知作为 Hollywood principle:

Don't call us, we will call you

如果您需要控制应用程序生命周期,也许接下来的操作会对您有所帮助:https://www.playframework.com/documentation/latest/api/scala/play/api/inject/ApplicationLifecycle.html

此外,如果您想更精确地控制应用程序加载过程,您可能需要创建自己的 ApplicationLoader,如本节所述:https://www.playframework.com/documentation/latest/api/scala/play/api/inject/ApplicationLifecycle.html