一个新手问题:是否有可以根据我在属性文件中设置的条件注入不同的bean.这是我想要实现的:
我在属性文件中设置了一些值.如果是真的,那我想@H_404_3@
public class MyClass{ @EJB private MyBean bean; }
如果是假的,那么@H_404_3@
public class MyClass{ @EJB private MyBean2 bean2; }
这是可行吗@H_404_3@
解决方法
如Gonzalo所说,如果要将其声明为类字段并使用其不同的实现,首先需要指定bean的公共接口.
此外,我认为您可以使用CDI的@Produces方法来实现更优雅;即在这些线之间:@H_404_3@
@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;
并且将根据您的条件为您注入适当的豆.@H_404_3@
如果您不需要类级别的字段,您可以使用旧方法,并在JNDI中定位EJB – 以这种方式,您可以控制什么类型和什么bean应该位于和使用.@H_404_3@
编辑:我添加了@EJB注释的bean来显示’myBean1’和’myBean2’实例可能来自哪里.@H_404_3@
此示例显示,您可以有一个单一的位置,您可以在不同的EJB实现和其他组件上定义所有依赖关系.在一个例子中,这可以被实现为具有@EJB字段,@PersistenceContext字段等的单例EJB.@H_404_3@
而不是以呈现的方式执行此操作,您可以将return myBean1更改为return context.lookup(“JNDI_NAMESPACE_COORDINATES”),其中context是InitialContext的实例.@H_404_3@
希望这使得它更清楚.@H_404_3@