一个新手问题:我是否可以根据我在属性文件中设置的条件注入不同的bean ?以下是我想要实现的:
我在属性文件中设置了一些值。如果它为真,那么我想 public class MyClass{
@EJB
private MyBean bean;
}
如果为假,则
public class MyClass{
@EJB
private MyBean2 bean2;
}
这可行吗?
正如Gonzalo所说,如果您希望将bean声明为类字段并使用它的不同实现,则首先需要指定该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。
EDIT:我已经添加了@EJB
注释bean,以显示'myBean1'和'myBean2'实例可能来自何处。
这个例子显示了您可以有一个单独的地方,在那里您定义了对不同EJB实现和其他组件的所有依赖。在一个示例中,这可以作为具有@EJB字段、@PersistenceContext字段等的单例EJB来实现。
您可以将return myBean1
更改为return context.lookup("JNDI_NAMESPACE_COORDINATES")
,其中context
是InitialContext
的一个实例。
我认为您不能修改被注入的bean的类型。我想说这是Java的限制,因为它是一种强类型语言:)
然而,您可以有这样的场景:多个bean实现相同的接口,并且您希望注入该接口的特定实现,如下所示:
@Local
public interface MyBean {
}
@Stateless
public class MyBeanImpl1 implements MyBean {
}
@Stateless
public class MyBeanImpl2 implements MyBean {
}
那么你可以这样做:
public MyClass {
@EJB(beanName="MyBeanImpl1")
MyBean myBean;
}
或
public MyClass {
@EJB(beanName="MyBeanImpl2")
MyBean myBean;
}