ActorSystem单例注入
ActorSystem singleton injection
在我的项目中,我必须使用演员和调度程序。我的所有需求都可以通过仅使用一个演员系统来完成。但是我需要不止一个 class 中的调度程序和参与者。所以我的问题是,如果我应该像下面那样在每个 class 中注入演员系统,它会只创建一个演员系统还是多个演员系统?我不想创建多个演员系统,因为这不是推荐的做法。
import akka.actor.ActorSystem
@Singleton
class someClass @Inject()(actorSystem: ActorSystem){....} // abstract class ActorSystem extends ActorRefFactory
@Singleton
class anotherClass @Inject()(actorSystem: ActorSystem){....}
或者我应该创建另一个对象并在其中声明一个 actor 系统,然后像这样在任何地方使用它:
import akka.actor._
object actorSystemObject {
val system: ActorSystem = ActorSystem()
}
哪种方法更好、更标准?
假设您使用的是 guice,请像这样尝试 providing a singleton
@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()
则hashCode
不同,例如
2050462663
1117871068
在我的项目中,我必须使用演员和调度程序。我的所有需求都可以通过仅使用一个演员系统来完成。但是我需要不止一个 class 中的调度程序和参与者。所以我的问题是,如果我应该像下面那样在每个 class 中注入演员系统,它会只创建一个演员系统还是多个演员系统?我不想创建多个演员系统,因为这不是推荐的做法。
import akka.actor.ActorSystem
@Singleton
class someClass @Inject()(actorSystem: ActorSystem){....} // abstract class ActorSystem extends ActorRefFactory
@Singleton
class anotherClass @Inject()(actorSystem: ActorSystem){....}
或者我应该创建另一个对象并在其中声明一个 actor 系统,然后像这样在任何地方使用它:
import akka.actor._
object actorSystemObject {
val system: ActorSystem = ActorSystem()
}
哪种方法更好、更标准?
假设您使用的是 guice,请像这样尝试 providing a singleton
@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()
则hashCode
不同,例如
2050462663
1117871068