java - Guice:在 Binder 内独立使用相同的实例

标签 java kotlin dependency-injection guice

是否可以创建一个单例对象,并能够将其作为一个实例独立注入(inject),或者作为集合或映射的一部分注入(inject)?

例如,我有两个这样的实例:

@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)它们。但是,我还有一个用例,我想将它们注入(inject)到一个集合中。

所以类似:

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

是否可以创建使用已定义实例的MultiBinder?如何单独使用集合中的同一个实例?

最佳答案

在你的 Guice 模块中,你可以将这些实例绑定(bind)到一个集合,如下所示:

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

由于您实际上并未调用提供者方法,因此注入(inject)器可以维护提供者提供的事物的单例性。

关于java - Guice:在 Binder 内独立使用相同的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58540410/

相关文章:

java - 我到底如何中断一个线程?

java - 使用 BufferedReader 在 java 中读取终端命令的输出

android - 当我选择了 View 并向下滑动状态栏时,当我再次将其抬起时未选择 View

java - 如何动态确定运行时使用的服务类

java - getSOAPBody 返回 NULL 而 SOAPResponse.writeTo 打印整个消息,奇怪吗?

java - 在 Spring 中动态注入(inject)类

kotlin - 如何禁用 Ktor 客户端 SSL 验证?

asp.net-mvc - MVC 存储库模式 - 访问其他存储库

php - PHP 5.3 中的依赖注入(inject)

java - 架构 : Data Persistency , 搜索和推荐系统