如何在类中注入多个相同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
相关产品推荐
相关产品推荐

