长袜子皮皮93
2019-10-26 23:12
还是不明白Provider绑定有什么用,感觉就类似于一工厂么,需要的时候创建一个bean,但是如果在configure()方法里面注入的话缺又相当于一个单例bean(前提开发人员不去new),有点搞不懂...,请问它到底用在什么地方?另外对于非接口类型的依赖无需代码绑定,Guice会自动创建,那么就没必要使用Provider啊,需要的时候Guice总会给我一个
稍微改了下代码, 这种情况下, 似乎只有使用 Provide 了
trait Db
class MemoryDb extends Db
@Singleton
class DatabaseActor @Inject() (@Name("MemoryDb") db: Db) extend Actor {
// ......
}
// 这里还是使用的 bind 来绑定注入
class DbClient @Inject() (@Name("DbActor") actorRef: ActorRef)
// ActorSystem 可以由启动类中来实例化
class MyModule(system: ActorSystem) extends AbstractModule with ScalaModule { bind[Db].annotatedWith(Names.named("MemoryDb")).to[MemoryDb]
@Provides
@Named("DbActor")
// 这里的参数 Db 只有靠 Provide 的绑定传递了.
def dbActorRef(db: Db): ActorRef = {
system.actorOf(Props.create(classOf[DbActor], db))
}
}
又想了想, 如果这么写, 好像确实可以不用 Provide (但Provide 提供的延迟加载的能力, bind 无法实现)
@Singleton
class DatabaseActor extend Actor {
// ......
}
// 这里还是使用的 bind 来绑定注入
class DbClient @Inject() (@Name("Database") actorRef: ActorRef)
// ActorSystem 可以由启动类中来实例化
class MyModule(system: ActorSystem) extends AbstractModule with ScalaModule {
bind[ActorRef].annotatedWith(Names.named("Database"))
.toInstance(system.actorRef(Props.create(classOf[DatabaseActor])))
}
如果一个类的构造方法不是由你控制的, 比如 Akka 里的 ActorRef 的实例方法, 源码对外只提供了 ActorSystem.actorOf()这种方式, 这个时候就需要使用 Provider 来告诉 Guice ActorRef 的实例如何来构造
这里的 actorRef 的实例化方式只能由 ActorSystem.actorOf() 实现
class DatabaseActor extend Actor {
// ......
}
// 这里 Guice 会使用 provide 中提供的 DatabaseActor 的构造方法来注入
class DbClient @Inject() (@Name("Database") actorRef: ActorRef)
class MyModule extends AbstractModule with ScalaModule {
bind[ActorSystem].toInstance(ActorSystem("DbSystem"))
@Provides
@Singleton
@Name("Database")
def generateDbActor(system: ActorSystem): ActorRef {
system.actorOf(Props.create(classOf[DatabaseActor]))
}
}
很好的问题 同问
使用Google Guice实现依赖注入
10149 学习 · 14 问题
相似问题
回答 1