Как я могу внедрить реализацию EJB 3, если я знаю, какой из них использовать до времени выполнения, основываясь на условии? - PullRequest
0 голосов
/ 26 января 2012

Есть ли способ решить, какую реализацию EJB использовать во время выполнения, когда у вас более одной реализации?Я не могу использовать аннотации или дескриптор развертывания, потому что логика не известна до времени выполнения.

Допустим, у меня есть следующие реализации EJB: MyEJBFoo MyEJBBar, оба реализуют MyEJB бизнес-интерфейс.Как я могу по-прежнему выполнять внедрение зависимостей этого EJB, если используемая реализация известна до времени выполнения, скажем, с флагом, называемым DEV_MODE = TRUE / FALSE, хранящимся в пакете ресурсов, и если это правда, он должен использовать MyEJBFoo, и еслитогда это ложь MyEJBBar.

Я думал о фабричном паттерне, но я не уверен, что это лучший способ сделать это.

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Просто будьте внимательны при разрешении точек впрыска соответственно при использовании одного интерфейса для двух реализаций (описано здесь ).

Кроме того, если у вас есть возможность использовать CDI, ознакомьтесь с методами-производителями , так как они делают возможным именно такие вещи.

2 голосов
/ 26 января 2012

Использовать делегирование MyEJB:

public class MyEJBDelegatingImpl implements MyEJB {
    // Inject: can't remember exact annotation
    private MyEJB myEJBFoo;

    // Inject: can't remember exact annotation
    private MyEJB myEJBBar;

    private getDelegate() {
        if (condition for myEJBFoo) {
            return myEJBFoo;
        } else {
            return myEJBBar;
        }
    }

    ...
    //Now implement MyEJB delegating to getDelegate()
} 

Единственное предостережение в том, что оба экземпляра (myEJBFoo и myEJBBar) должны быть инстанцируемыми независимо от условий среды, потому что вы безоговорочно вводите оба в делегирование MyEJB.

...