当我调用 akka.http.scaladsl.Http.apply() 时,从哪里提供隐式?

where is the implicit being supplied from when i invoke akka.http.scaladsl.Http.apply()?

我正在使用 Akka HTTP 来支持 REST,我需要在另一个部分使用 Actors 我正在开发的服务器。我的理解是通常需要使用一个 ActorSystem 整个应用程序中的实例。根据 akka.http.scaladsl.Http.apply() 的定义, 似乎当我使用 Http 方法时,就像我下面的代码片段中一样 --

val service: FooRestService = new FooRestService()
Http(). bindAndHandle(service.route, "localhost", 8080)   // something is supplying the imply method w/ implicit ActorSystem ! 

--- Http 对象的 apply() 方法以某种方式提供了隐式 ActorSystem 实例...为了便于参考,Http.apply() 定义如下:

package akka.http.scaladsl.Http
        ...
    object Http {
        ...
      def apply()(implicit system: ActorSystem): HttpExt = super.apply(system)

因为我需要严格遵守一个 ActorSystem 实例,所以我想在我的系统中提供另一个(非 REST)基于 Actor 的代码 与提供给 Http apply() 方法的引用相同。

我猜想我的代码一定是在用一个带有隐式 ActorSystem 的包对象对包进行包导入,或者 一定是通过其他方式,这种隐含就像夜深人静时的忍者一样悄悄溜进来。我已经四处寻找了很多, 但想不通 ;^(

非常感谢任何建议!

不确定我是否完全理解问题所在,但在你的每个演员中你都有 context: ActorContext。您可以从 context.system 获得 ActorSystem。因此,您不需要显式传递 ActorSystem

以下是我如何使用@expert 的回答(上图)来调试我的隐式来源。关键是从获取隐式的 Actor 中转储系统变量。然后查看名称以找出隐式的来源。在我的例子中,隐式来自我自己的代码(多么愚蠢!)。无论如何..感谢上面的答案,我的问题已经解决了。

    val http: HttpExt = Http()
    val sys = http.system
    System.out.println("sys:" + sys);
    http. bindAndHandle(
        service.route, "localhost", injector.getInstance(classOf[Conf]).getInt(PROVISIONER_PORT )
      )