2

在我的项目中,我必须使用演员和调度程序。我所有的需求都可以通过只使用一个演员系统来完成。但我需要不止一个班级的调度员和演员。所以我的问题是,如果我应该像下面这样在每个类中注入演员系统,它会只创建一个演员系统还是一个以上?我不想创建多个演员系统,因为这不是推荐的做法。

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()
}

哪种方法会更好更标准?

4

1 回答 1

4

假设您正在使用 guice,请尝试像这样提供一个单例

@Provides
@Singleton
def getActorSystem: ActorSystem = ActorSystem()

例如

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()

那么hashCodes 不同,例如,

2050462663
1117871068
于 2019-07-17T12:14:42.840 回答