簡體   English   中英

Guice:在活頁夾內獨立使用同一個實例

[英]Guice: use the same instance independently and inside the binder

是否可以創建一個 singleton object,並能夠將其作為一個實例獨立注入,或者作為集合或 map 的一部分注入?

例如,我有兩個這樣的實例:

@Provides
@Singleton
@Named(value = "bike.listener")
fun bikeListener(
    mapper: ObjectMapper,
    amazonSNS: AmazonSNS,
    kafkaPublisher: KafkaPublisher
): PublishingListener {
    return PublishingListener(
        mapper = mapper,
        amazonSns = amazonSNS,
        kafkaPublisher = kafkaPublisher
    )
}

@Provides
@Singleton
@Named(value = "car.listener")
fun carListener(
    mapper: ObjectMapper,
    amazonSNS: AmazonSNS,
    kafkaPublisher: KafkaPublisher
): PublishingListener {
    return PublishingListener(
        mapper = mapper,
        amazonSns = amazonSNS,
        kafkaPublisher = kafkaPublisher,
    )
}

...我通過@Named參數直接注入它們,在我的類中使用它們。 但是,我也有一個用例,我想將它們都注入一個集合中。

所以像:

@Inject
Set<PublishingListener> listeners; // carListener and bikeListener here

是否可以創建使用已定義實例的MultiBinder 如何在集合中單獨使用相同的實例?

在您的 Guice 模塊中,您可以將這些實例綁定到這樣的集合:

@Provides
fun publisherListenerSet(
    @Named("car.listener") val carListener: PublisherListener,
    @Named("bike.listener") val bikeListener: PublisherListener
): Set<PublisherListener> { 
    setOf(carListener, bikeListener)
}

或者您可以使用:

protected override fun configure() {
    val publishingListenerSetBinder = Multibinder.newSetBinder(binder(), PublisherListener::class.java)
    publishingListenerSetBinder.addBinding().annotatedWith(Names.named("car.listener"))!!.to(PublishingListener::class.java)
    publishingListenerSetBinder.addBinding().annotatedWith(Names.named("bike.listener"))!!.to(PublishingListener::class.java)
}

由於您實際上並未調用提供者方法,因此 Injector 可以保持提供者提供的事物的單例性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM