一个新手问题:是否有可以根据我在属性文件中设置的条件注入不同的bean.这是我想要实现的:
public class MyClass{ @EJB private MyBean bean; }
如果是假的,那么
public class MyClass{ @EJB private MyBean2 bean2; }
这是可行吗
解决方法
如Gonzalo所说,如果要将其声明为类字段并使用其不同的实现,首先需要指定bean的公共接口.
此外,我认为您可以使用CDI的@Produces方法来实现更优雅;即在这些线之间:
@Singleton @Startup public class Configuration { private boolean someCondition; @PostConstruct private void init() { someCondition = ... // get a value from DB,JMS,XML,etc. } @EJB(lookup="java:comp/env/myParticularBean") MyBean myBean1; @EJB(beanName="anotherTypeOfBeanInjectedByName") MyBean myBean2; @Produces public MyBean produceMyBean() { if (someCondition) return myBean1; } else { return myBean2; } } }
然后在你的代码中,你可以使用:
@Inject MyBean myBean;
并且将根据您的条件为您注入适当的豆.
如果您不需要类级别的字段,您可以使用旧方法,并在JNDI中定位EJB – 以这种方式,您可以控制什么类型和什么bean应该位于和使用.
编辑:我添加了@EJB注释的bean来显示’myBean1’和’myBean2’实例可能来自哪里.
此示例显示,您可以有一个单一的位置,您可以在不同的EJB实现和其他组件上定义所有依赖关系.在一个例子中,这可以被实现为具有@EJB字段,@PersistenceContext字段等的单例EJB.
而不是以呈现的方式执行此操作,您可以将return myBean1更改为return context.lookup(“JNDI_NAMESPACE_COORDINATES”),其中context是InitialContext的实例.
希望这使得它更清楚.