如何在运行时选择要注入的bean

时间:2012-10-24 07:16:06

标签: java-ee ejb cdi

我正在尝试找到一种在运行时注入几个EJB的方法。

场景如下: 有两个bean(ejbA,ejbB)都实现了相同的接口(ejbInterface)。在几个注入点(其他托管bean,即在ejbCaller bean中),我想注入一个ejbInterface的实现。我将在运行时知道我需要哪一个(即基于某个DB值)。

我知道一种可行的方法是通过@Alternative注释和部署描述符在部署时进行选择,但我宁愿在运行时做出选择。

我已经尝试过@Producer方法,但这样我只能注入非托管对象(我在生产者中实例化的对象,不是容器管理的,也可以是自己的注入点)。我找到了两个制作人的解决方法/漏洞:

  • 生成一个未管理的对象,并通过ejbInterface中的setup方法传递任何托管对象(即其他bean,实体管理器)(ejbCaller必须传递这些)
  • 在生产者中使用JNDI查找并返回托管对象

这两种解决方法都容易出错而且不够优雅。对此有更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

注入BeanManager并使用

javax.enterprise.inject.spi.BeanManager.getBeans(Type, Annotation...)

在运行时