当前位置: 首页 > 知识库问答 >
问题:

Guice:在活页夹中独立使用同一个实例

墨财
2023-03-14

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

例如,我有两个类似的Instance:

@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?如何在集合中单独使用相同的实例?

共有1个答案

楮自珍
2023-03-14

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

由于您实际上没有调用provider方法,注入器可以保持provider提供的东西的单一性。

 类似资料:
  • 对不起,如果这是一个微不足道的问题,我是新的指南。假设我有下面这个类: 然后在其他地方我想做: 我希望有两个“MyClass”实例,一个名为“foo ”,一个名为“bar ”(也就是说,它们中的每一个都有一个不同的依赖实例)。我如何将这两个实例添加到我的注入器中,如何用“injector.getInstance”检索它们中的每一个? 我不想为每个可能的依赖项创建一个“MyClass”的子类。 谢谢

  • 你也可以在spring容器外使用repository组件,比如在CDI环境中,你依然需要一些spring的libraries在你的classpath中,但通常你也能以编程的方式来搭建repositories。你可以像下面示例一样使用由Spring Data模块提供各种repository持久化支持的RepositoryFactory。 RepositoryFactorySupport factor

  • 我在同一个活动中使用了两个时间选择器,让用户为特定任务选择开始时间和停止时间,我使用了支持库中可用的DialogFragment类,以向后兼容旧的Android版本。

  • 我正在尝试制作一个定制的spring cloud stream活页夹,但它无法自动注册: 活页夹实现: 配置类: Spring活页夹文件: application.yml 我已经按照spring cloud stream的指导方针创建了一个custome活页夹,但这不起作用。此外,使用@Configuration创建绑定bean会禁用我在类路径上添加的kafka绑定。

  • 开发者可以在脱离Spring容器的情况下利用RepositoryFactory来使用Spring Data repository(比如在CDI环境下),但仍然需要将某些Spring的依赖包加到classpath中。 Example 14. Standalone usage of repository factory(独立使用) RepositoryFactorySupport factory =