Guice:在活页夹中独立使用相同的实例
Guice: use the same instance independently and inside the binder
是否可以创建一个单例对象,并能够将其作为一个实例独立注入,或者作为集合或映射的一部分注入?
例如,我有两个这样的实例:
@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)
}
由于您实际上并没有调用提供者方法,因此注入器可以保持提供者提供的事物的单例性。
是否可以创建一个单例对象,并能够将其作为一个实例独立注入,或者作为集合或映射的一部分注入?
例如,我有两个这样的实例:
@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)
}
由于您实际上并没有调用提供者方法,因此注入器可以保持提供者提供的事物的单例性。