将几个相同的 CDI bean 注入 class?

Inject several of the Same CDI bean into a class?

目前,我的 CDI bean 注入一次即可完成所有工作,但我需要大约 6 到 10 个单独的实例(?),具体取决于我的输入。 (理想情况下,我希望能够根据需要的数量注入动态数量的相同 CDI bean。)

不幸的是,我需要注入 bean,因为 class 依赖于另一个 CDI bean。 (参见下面的 2.CDI bean class)

  1. 客户class
@ApplicationScoped
public class Clients {
   Publisher pub;
   Subscriber sub;
   @Inject
   ListenerBean listener;

   public void init(){
      pub = new Publisher();
      sub = new Subscriber(listener);
   }
}
  1. CDI 豆 class
@Dependent
public class ListenerBean{
   @Inject
   private eventHandler h;

   public void onMessage(Msg msg){
      h.doesSomething();
   }
}

我正在寻找的功能,但不确定那里有哪些功能。我还没有发现有人想要完成同样的事情。

for(Subscriber s: listOfSubscribers){
   @Inject
   ListenerBean l;
   s = new Subscriber(l);
}

// The only thing I can do right now is
@Inject
ListenerBean listener1;
@Inject
ListenerBean listener2;
@Inject
ListenerBean listener3;
@Inject
ListenerBean listener4;

编辑:听众 do 需要可识别。 (注入后调用 setter。)可能不是最佳实践,但不确定如何实现此 -

@Inject
ListenerBean listener1;
listener1.setTopic("TopicA");

如果你需要注入几个 不同的 @Dependent 作用域 bean 的实例,你可以通过 programmatic lookup 来实现——换句话说,通过 Instance<T>.

通过 Instance@Dependent bean 的每个 bean 解析都会导致创建一个新的 bean 实例。以下代码说明:

@Inject Instance<ListenerBean> instance;

public void createMultipleBeanInstances() {
  // bean1 and bean2 are two different instances because the bean is @Dependent
  // you can OFC do this in a cycle and generate as many as you like
  ListenerBean bean1 = instance.get(); 
  ListenerBean bean2 = instance.get();
}

请注意,您通过编程查找创建的依赖 bean 将其生命周期绑定到 Instance 对象,这意味着它们将与 Instance 一样存在。鉴于您 @Inject Instance 进入 bean,它将与注入的 bean 一起被销毁。

我评论后的解释。不过我可能误解了你的问题。

首先,您的代码看起来基本上类似于多播器的实现:您注入了几个对象,这些对象都实现了一个公共接口来调用相同的方法。

我认为,在尝试注入各种接收器对象时,您基本上有一个 X-Y 问题:发射器是否真的需要 知道 接收器,或者这就足够了, 活动是否达到目标?

如果我的假设是正确的,即您的发射器并不真的需要 了解 订阅者,您可以简单地使用 Event 标准机制:

首先,定义一个消息(可以携带额外的信息,但这不是特别需要的,你只需要一个class):

public class MyMessage {
     // if needed, add some fields
}

然后,在您的发射器中,注入相应的事件类型,并使用它来触发消息:

@Inject
private Event<MyMessage> myEvent;  // note: type is message, not the bean

...

myEvent.fire(new MyMessage()); // to broadcast the message to everyone who is interested

在您的订阅者中,只需@Observe 消息:

public void theMethodWeWantCalled(@Observes MyMessage messageObject) {
    // do things here
}

就是这样:无需耦合发射器和订阅器。