Вы можете использовать альтернативы CDI и использовать @Inject вместо @EJB для внедрения. Примеры: 1) если вам нужно указать реализацию во время развертывания, вы можете использовать альтернативный
интерфейс:
import javax.ejb.Local;
@Local
public interface MyserviceInterface2 {
String doSomthing();
}
реализаций
@Alternative
@Stateless
public class Interface2Impl1 implements MyserviceInterface2{
@Override
public String doSomthing() {
return "Impl1";
}
}
@Alternative
@Stateless
public class Interface2Impl2 implements MyserviceInterface2{
@Override
public String doSomthing() {
return "Impl2";
}
}
выберите вашу реализацию в beans.xml
<alternatives>
<class> [your package].Interface2Impl1</class>
</alternatives>
Точка внедрения:
inject in client class
public class ClientClass {
@Inject
MyserviceInterface2 myserviceInterface2;
...
2), если вы хотите выбрать реализацию во время выполнения, вы могли бы использовать производит
создать следующие квалификаторы
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Impl1Qulifier {
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface Impl2Qulifier {
}
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
public @interface SelectedImpQulifier {
}
интерфейс:
@Local
public interface MyServiceInterface {
String doSomthing();
}
реализации:
@Impl1Qulifier
@Stateless
public class MyServiceImpl1 implements MyServiceInterface{
@Override
public String doSomthing() {
return "Impl1";
}
}
@Impl2Qulifier
@Stateless
public class MyServiceImpl2 implements MyServiceInterface{
@Override
public String doSomthing() {
return "impl2";
}
}
производит:
public class ImplProvider {
@Inject @Impl1Qulifier
MyServiceInterface impl1;
@Inject @Impl2Qulifier
MyServiceInterface imp2;
@Produces @SelectedImpQulifier
MyServiceInterface createServiceInterface(InjectionPoint injectionPoint ) {
// if( your conditions ){
// return impl1
// }
return imp2;
}
}
точка ввода:
public class ClientClass {
@Inject @SelectedImpQulifier
MyServiceInterface myServiceInterface;
...
вы также можете использовать поиск JNDI для второй ситуации
Вы также можете поместить каждую реализацию в отдельный модуль (jar) и использовать подходящийдля каждой среды в ухе, созданной для этой среды (выполняя правильную сборку для каждой из них)