Provider綁定
還是不明白Provider綁定有什么用,感覺就類似于一工廠么,需要的時候創建一個bean,但是如果在configure()方法里面注入的話缺又相當于一個單例bean(前提開發人員不去new),有點搞不懂...,請問它到底用在什么地方?另外對于非接口類型的依賴無需代碼綁定,Guice會自動創建,那么就沒必要使用Provider啊,需要的時候Guice總會給我一個
還是不明白Provider綁定有什么用,感覺就類似于一工廠么,需要的時候創建一個bean,但是如果在configure()方法里面注入的話缺又相當于一個單例bean(前提開發人員不去new),有點搞不懂...,請問它到底用在什么地方?另外對于非接口類型的依賴無需代碼綁定,Guice會自動創建,那么就沒必要使用Provider啊,需要的時候Guice總會給我一個
2019-10-26
舉報
2020-12-22
稍微改了下代碼, 這種情況下, 似乎只有使用 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)) ????} }2020-12-22
又想了想,?如果這么寫,?好像確實可以不用 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]))) }2020-12-22
如果一個類的構造方法不是由你控制的, 比如 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])) ????} }2020-01-16
很好的問題 同問