Scala ActorSystem单离子注入

Scala ActorSystem单离子注入,scala,dependency-injection,singleton,akka,akka-actor,Scala,Dependency Injection,Singleton,Akka,Akka Actor,在我的项目中,我必须使用参与者和调度器。我所有的需求都可以通过使用一个参与者系统来实现。但我需要不止一个类中的调度员和演员。所以我的问题是,如果我像下面这样在每个类中注入actor系统,它将只创建一个actor系统还是多个actor系统?我不想创建多个参与者系统,因为这不是推荐的做法 import akka.actor.ActorSystem @Singleton class someClass @Inject()(actorSystem: ActorSystem){....} // abst

在我的项目中,我必须使用参与者和调度器。我所有的需求都可以通过使用一个参与者系统来实现。但我需要不止一个类中的调度员和演员。所以我的问题是,如果我像下面这样在每个类中注入actor系统,它将只创建一个actor系统还是多个actor系统?我不想创建多个参与者系统,因为这不是推荐的做法

import akka.actor.ActorSystem

@Singleton
class someClass @Inject()(actorSystem: ActorSystem){....} // abstract class ActorSystem extends ActorRefFactory

@Singleton
class anotherClass @Inject()(actorSystem: ActorSystem){....}
或者我应该创建另一个对象,并在其中声明一个参与者系统,然后像这样在任何地方使用它:

import akka.actor._

object actorSystemObject {
    val system: ActorSystem = ActorSystem()
}

哪种方法更好、更标准?

假设您使用的是guice,请尝试类似的方法

比如说

import akka.actor.ActorSystem
import com.google.inject.{AbstractModule, Guice, Inject, Injector, Provides, Singleton}
import scala.jdk.CollectionConverters._

class MyModule extends AbstractModule {
  @Provides
  @Singleton
  def getActorSystem: ActorSystem = ActorSystem()
}

@Singleton
class SomeClass @Inject()(actorSystem: ActorSystem) {
  println(actorSystem.hashCode())
}

@Singleton
class SomeOtherClass @Inject()(actorSystem: ActorSystem) {
  println(actorSystem.hashCode())
}

object Hello extends App {
  val injector: Injector = Guice.createInjector(List(new MyModule).asJava)
  injector.getInstance(classOf[SomeClass])
  injector.getInstance(classOf[SomeOtherClass])
}
输出类似于

1731656333
1731656333
在这里,我们看到相同的
ActorSystem
被注入,正如相同的
hashCode
所显示的那样

假设我们这样删除
@Singleton
提供程序

@Provides
def getActorSystem: ActorSystem = ActorSystem()
然后hashCode不同,例如

2050462663
1117871068

当然,为了避免全局对象,最好使用某种形式的依赖项注入。
2050462663
1117871068