Что вы подразумеваете под: «В зависимости от конфигурации ...» Когда вы решаете, что использовать? Во время компиляции или во время выполнения?
Есть несколько способов сделать это:
1. @Alternative и bean. xml
Аннотируйте SomeService и OtherService с помощью @Alternative и снова активируйте один из них в bean-компонентах. xml с
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
<alternatives>
<class>SomeService</class>
</alternatives>
</beans>
2 , С помощью спецификатора и источника:
@Qualifier
@Retention(RUNTIME)
@Target({TYPE, METHOD, FIELD, PARAMETER})
public @interface First {}
И аннотируйте оба компонента с помощью:
@First
@Stateless
public SomeService{ ... }
Теперь вы можете иметь класс производителя, который выглядит следующим образом:
@Dependent
public class ServiceProducer {
@Inject
@First
private Service someService;
@Inject
@Second
private Service otherService;
@Produces
@Default
public Service getService() {
switch (someCondition) {
case SOME:
return someService;
case OTHER:
return otherService;
default:
return null;
}
}
}
И, наконец, введите Сервис, где вы хотите его использовать:
@Inject
Service service;
3. Без Producer, но с аннотациями-квалификаторами
Вам нужно Annotate SomeService и OtherService, чтобы заставить это работать.
@Inject
Instance<Service> services;
public void someBussinessMethod(){
Annotation qualifier = someCondition ? new AnnotationLiteral<First>() {} : new AnnotationLiteral<Second>() {};
Service s = services.select(qualifier).get();
}
4. Без квалификатора
На мой взгляд, это самое уродливое и медленное решение, но вы можете переключиться между сервисами Injectend и решить класс, хотите ли вы его использовать.
@Inject
Instance<Service> services;
public void doSomething() {
Class clazz = someCondition ? SomeService.class : OtherService.class;
Service first = services.stream().filter(s -> s.getClass() == clazz).findFirst().get();
}
Подробное объяснение можно найти здесь: https://docs.jboss.org/cdi/learn/userguide/CDI-user-guide.html#injection