You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在类中注入多个相同CDI Bean及支持动态数量实例?

解决方案

CDI 提供了Instance<T>接口专门处理动态获取同类型Bean实例的场景,正好匹配你的需求,具体实现步骤如下:

核心实现逻辑

你当前的ListenerBean是@Dependent作用域,每次通过Instance获取实例时都会返回全新的独立对象,且CDI会自动完成其内部依赖(比如你注入的eventHandler)的装配,不需要手动处理依赖注入。

修改后的Clients类代码

import jakarta.enterprise.inject.Instance; // 如果用的是旧版Java EE请导入javax.enterprise.inject.Instance
import java.util.ArrayList;
import java.util.List;

@ApplicationScoped
public class Clients {
   Publisher pub;
   List<Subscriber> listOfSubscribers = new ArrayList<>();

   // 注入ListenerBean的实例生产者
   @Inject
   Instance<ListenerBean> listenerInstance;

   // 传入你需要监听的topic列表即可动态生成对应数量的实例
   public void init(List<String> topics){
      pub = new Publisher();
      for(String topic : topics){
          // 每次调用get()都会生成一个全新的独立ListenerBean实例
          ListenerBean listener = listenerInstance.get();
          listener.setTopic(topic);
          Subscriber s = new Subscriber(listener);
          listOfSubscribers.add(s);
      }
   }

   // 应用停止时主动销毁实例避免内存泄漏(可选,建议添加)
   public void destroy(){
       for(ListenerBean listener : listenerInstance){
           listenerInstance.destroy(listener);
       }
   }
}

注意事项

  • 该方案支持任意数量的实例生成,你只需要传入对应长度的topic列表即可,不需要硬编码注入每一个ListenerBean
  • @Dependent作用域的Bean默认生命周期由持有它的Bean管理,主动调用destroy()方法销毁不再使用的实例可以及时释放资源

内容的提问来源于stack exchange,提问作者dko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 21:45:02