Инъекция зависимостей EJB 3 - слишком много вариантов? - PullRequest
10 голосов
/ 14 марта 2011

Мы начинаем новый проект на основе EJB 3.0. У меня есть «весенний» фон (и мне это нравится), поэтому для меня слабая связь и тестируемость - это большая необходимость . Этот пост не должен быть о "ejb vs. spring". Было бы идеально, если у вас уже есть реальный опыт работы с проектами.

Вот пример кода для демонстрации проблемы:

клиент -> ejb -> сотрудник 1 -> сотрудник .. -> сотрудник n

<!-- language: java -->
@Stateless
public class SampleService {

    // or @Inject via CDI
    // or @Autowired via Spring
    @EJB // or just use a stateless session bean via EJB 3.0
    private Bank bank;

    // same for this component
    @EJB
    private Calculator calc;

    // both collaborators must be settable from outside, to make everything testable (and mockable)

    /**
     * sample "business service" called from client
     */
    public void debit(BigDecimal amount){
        calc.calculate(amount.subtract(new BigDecimal(100)));
        bank.debit(amount);
    }

}

// or via @Component (Spring), or CDI?
@Stateless // or Stateless Session bean with optional @Service/@Singleton annotation?
public class Calculator {
    public void calculate(BigDecimal subtract) {
        // calculate stuff....
    }
}

// or via @Component (Spring), or CDI?
@Stateless // or Stateless Session bean with optional @Service/@Singleton annotation?
public class Bank {
    public void debit(BigDecimal amount) {
        // ...
    }
}

Я хочу знать, как лучше всего внедрить внедрение зависимостей для всех соавторов и их соавторов в ejb 3.0? соавторами в этом смысле могут быть очень и очень маленькие выделенные классы.

мы уже обсудили следующие варианты и, как всегда, пока не имеем правильного заключения:)

  1. использовать стандарт ejb только для всего, что является сессионным компонентом без сохранения состояния, и для всех последствий (таких как пул, обработка ресурсов и т. Д.)

  2. использовать сессионные компоненты без сохранения состояния в качестве «бизнес-компонентов» (точек входа) и с этого момента

a) пружинные зависимости (через интеграцию jboss snowdrop)

b) Проводные зависимости CDI (через WELD для ejb 3.0 и jboss eap 5.1)

Мне не нужно знать, как я могу использовать бины в модульном тесте. Ответ, который я получаю, заключается в том, каков наилучший подход для объединения всех зависимостей внутри работающего сервера приложений (пружина против хитрости, CDI и EJB). мне нужно знать только график от внешнего EJB («точки входа в бизнес») вниз. так что все, что находится снаружи (сервлеты, интерфейс и т. д.) - это , а не . Объем этого вопроса

пожалуйста, предположим, что EJB 3.0 и jboss eap 5.1 установлены для проекта:)

с нетерпением жду ваших ответов и, надеюсь, некоторые знания проекта.

Ответы [ 4 ]

4 голосов
/ 08 апреля 2011

Если вам нужно управление транзакциями на уровне методов, безопасность, управление параллелизмом или любые другие сервисы, которые может предложить сессионный компонент, то сделайте их сессионными EJB-компонентами.Вы можете начать с управляемых bean-компонентов, а затем сделать их сессионными bean-компонентами по мере необходимости.

Если вы хотите внедрить эти сессионные bean-компоненты в управляемые bean-компоненты (которые в CDI есть что-либо в jar-файле, который содержитфайл beans.xml в каталоге meta-inf), затем используйте @EJB.Если вы хотите внедрить простой управляемый компонент в компонент сеанса, используйте @ Inject.

Если вы хотите внедрить компоненты удаленного сеанса (или любой удаленный ресурс Java EE), тогда эта ссылка объясняет, как вы можете сделать это черезадаптер класса.По сути, он хранит все ваши неприятные строки для поиска и т. Д. В одном месте и позволяет вам обрабатывать эти удаленные ресурсы точно так же, как и любой другой инъецируемый компонент (с помощью аннотации @Produces для переменных-членов адаптера).Вам не нужно этого делать, но это рекомендуется.

Внедрение ресурсов Typesafe

2 голосов
/ 14 февраля 2014

Я бы определенно проголосовал против смешения фреймворков.

Я работаю над проектом, который подключен к EJB, Spring и JBoss Seam (а также имеет наполовину Flex, наполовину JSF-интерфейс). Настоящий технологический зоопарк!
В любом случае, соединение всего этого вместе - не самая плохая часть, у этих структур есть гибкие возможности внедрения. Тестирование также более или менее терпимо.
Самым болезненным было избавиться от утечек памяти, вызванных различными моделями жизненного цикла, синхронизировать транзакции и очистить поведение потоков.

Теперь мы переходим к чистой Java EE 6 (избавление от Spring, Flex и переход от Seam к CDI). Пока что мы действительно довольны результатами. Кстати, я не критикую весну. Придерживайтесь стека Java EE или Spring, их смешивание просто напрашивается на неприятности.

2 голосов
/ 14 марта 2011

Ну, в общем, в Java "слишком много вариантов выбора", поэтому, конечно, и в этой области.Я бы не стал описывать EJB как среду внедрения зависимостей общего назначения, скорее они используют DI для своих целей.Если это то, как вы хотите кодировать, вы должны добавить платформу для этой цели.Если вы знаете и любите весну, дерзайте.Я также использовал Guice с EJB ( здесь - хорошая кулинарная книга) для хорошего эффекта, если вам нужна еще одна структура, чтобы выяснить, как это сделать.

0 голосов
/ 14 марта 2011

Если ваша основная цель - разрешить внедрение зависимостей для тестирования, я бы порекомендовал просто установить эти значения, установив их в защищенные или установив их.Я фанат использования Mockito, чтобы заглушить все в Java EE EJB 3.0, и когда я выполняю любое тестирование вне интеграционного тестирования, чтобы просто позволить Mockito заглушить методы для меня, но если вы ищете полную инъекцию зависимостей, такую ​​как возможность иметьнесколько разных bean-компонентов, основанных на одном и том же классе, но с разными зависимостями, я бы порекомендовал, как сказал Ишай, и шел с Spring на вершине.

...