Как сказал Гонсало, вам сначала нужно будет указать общий интерфейс компонента, если вы хотите объявить его как поле класса и использовать его различные реализации.
Более того, я думаю, что вы могли бы добиться этого более элегантно, используя метод @Produces CDI; то есть между этими строками:
@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;
и соответствующий боб в зависимости от вашего состояния будет введен для вас.
Если вам не нужно поле на уровне класса, вы можете использовать старый способ и найти EJB в JNDI - таким образом, вы можете контролировать, какой тип и какой компонент должен быть расположен и использован.
РЕДАКТИРОВАТЬ: Я добавил аннотированные bean-компоненты @EJB
, чтобы показать, откуда могут возникнуть экземпляры myBean1 и myBean2.
Этот пример показывает, что у вас может быть одно-единственное место, где вы определяете все свои зависимости от различных реализаций EJB и других компонентов. Например, это может быть реализовано как одноэлементный EJB с полями @EJB, полями @PersistenceContext и т. Д.
Вместо того, чтобы делать это представленным способом, вы можете изменить return myBean1
на что-то вроде return context.lookup("JNDI_NAMESPACE_COORDINATES")
, где context
- это экземпляр InitialContext
.
Надеюсь, это прояснит ситуацию.