Маршрутизатор в Play - это singleton
@Singleton
class RoutesProvider @Inject() (
injector: Injector,
environment: Environment,
configuration: Configuration,
httpConfig: HttpConfiguration
) extends Provider[Router] {
...
bind[Router].toProvider[RoutesProvider]
, что фактически означает, что даже если класс контроллера не аннотирован с помощью @Singleton
, внедренный экземпляр контроллера по умолчанию используется повторно. между запросами, если маршрут не имеет префикса с оператором @
в routes
:
... если вы префикс контроллера с @ ... новое действие создается для каждого запроса .
Например, для
class MyClient
class HomeController @Inject()(cc: ControllerComponents, client: MyClient) extends AbstractController(cc) {
def index = Action {
Ok(s"HomeController identity = ${this.hashCode}\nMyClient identity = ${client.hashCode}")
}
}
и следующего routes
файла
GET / controllers.HomeController.index
разные запросы всегда возвращают одну и ту же идентификацию, несмотря на HomeController
не является одноэлементным
// request 1
HomeController identity = 409392943
MyClient identity = 475611387
// request 2
HomeController identity = 409392943
MyClient identity = 475611387
, однако, если мы используем оператор @
в файле маршрутов
GET / @controllers.HomeController.index
, мы видим, что идентичность меняется при каждом новом запросе:
// request 1
HomeController identity = 1249276649
MyClient identity = 1152488919
// request 2
HomeController identity = 41809453
MyClient identity = 213518354