Статьи

Почему я люблю EJB 3.0 и действительно люблю EJB 3.1

В 2002 году Марк Флери написал заслуживающую внимания Голубую книгу «Почему я люблю EJB» ( скачать ), что на тот момент было действительно удивительно. В то время я уже работал с EJB, но на самом деле не очень их любил :-). Я бы тоже не сказал «любовь», но мне действительно нравится EJB 3.0. Причины:

  1. Слишком низкая производительность. В Glassfish v2 только около 3% .
  2. EJB 3.0 — это сохранение потоков. Это огромное преимущество. Каждый поток получает собственный экземпляр — также все внедренные ресурсы (Entity Manager, Data Source, JMS) также сохраняются в потоке. Лучше всего: контейнер управляет ресурсами для вас. Требуется только аннотация (@EJB для EJB, @PersistenceContext для постоянства и @Resource для оставшихся ресурсов :-)). Просто попробуйте это с » простым старым веб-контейнером » :-). Подсказка: сервлеты являются небезопасными синглетонами.
  3. EJB 3.0 являются транзакционными . Таким образом, в случае успешного вызова метода все ресурсы будут синхронизированы (данные записываются в БД, сообщения отправляются на сервер). Контейнер делает это за вас — вы знаете только то, чего хотели бы достичь (это не зависит от платформы, но иногда достаточно сложно :-))
  4. Во всех моих проектах мы избавляемся от дескрипторов развертывания и используемых аннотаций. Был развернут только бережливый файл persistence.xml. Рефакторинг, развертывание и переносимость работали хорошо.
  5. EJB 3.0 действительно переносимы (и поэтому не зависят от вендора, фреймворка). Задано гораздо больше, чем EJB 2.1 дней — так что собственные дескрипторы развертывания больше не нужны. На самом деле дескрипторы не нужны. Вам нужно только развернуть один чистый jar с persistence.xml в meta-inf. Все остальное необязательно (и как-то подозрительно).
  6. Синергия между соглашением над конфигурацией (или официально: конфигурация с помощью исключения) и внедрением зависимости является отличной. На самом деле в большинстве случаев вы получаете с EJB-кодом меньше кода, чем без (без «новых» вызовов, только объявления).
    @Stateless
    public class SampleBean implements Sample {
    @PersistenceContext
    private EntityManager em;

    @EJB
    private Another anotherBean;
  7. Методы получения и установки являются необязательными: для EJB, а также для JPA. Это твое решение. Ресурсы могут быть непосредственно введены в поля.
  8. Настройки по умолчанию и настройки аннотаций могут быть отменены XML-дескрипторами. Дескрипторы XML не обязательно должны быть полными — можно указывать только интересные части. Вы можете легко изменить настройки производства, например, для постановки (тестирование, интеграция и т. Д.).
  9. На самом деле специальных инструментов не требуется. Вам нужны только аннотации, компилятор Java 6 и Jar. Однако поддержка в IntelliJ, Eclipse (с 500 дополнительными плагинами :-)) или Netbeans 6.1 действительно превосходна. Серверы приложений уже хорошо интегрированы — управление развертыванием, отключением, настройкой и т. Д. Может осуществляться непосредственно из IDE.
  10. EJB 3.1 будет встраиваемым из коробки. Однако Glassfish v3 уже готов к употреблению. Сейчас я тестирую WebContainer — это удивительно (начинается через 500 мс). JBoss также встраиваемый.
  11. EJB 3.1 будет иметь много полезных функций: Singletons (подходит для конфигурации, классов запуска и т. Д.), Улучшенную поддержку таймера (cron-like), асинхронные методы с Futures, дополнительные локальные интерфейсы и WAR-развертывание.
  12. Настройки пула и конфигурация пула потоков действительно полезны для управления масштабируемостью (и не масштабируются бесконечно, пока контейнер не рухнет :-))
  13. Они хорошо играют со скриптами (JavaScript, Groovy и т. Д.)
  14. EJB по умолчанию являются управляемыми и контролируемыми. Вы просто развертываете их в контейнере — и вы можете отслеживать вызовы методов, производительность и т. Д.
  15. Никаких дополнительных платформ, библиотек и т. Д. В первую очередь не требуется. В ejb-jar и контейнере содержится только код вашего приложения. Таким образом, NoClassDefFoundErrors, ClassCastExceptions и т. Д. Могут быть сведены к минимуму.
  16. EJB 3.0 ультра-худой. Вы на самом деле не можете что-то забрать :-). Тем не менее: я открыт для предложений.
  17. Их действительно легко протестировать — это просто класс с интерфейсом. Вы даже можете запустить их вне контейнера.
  18. Даже простые варианты использования могут быть эффективно реализованы с помощью EJB 3. См., Например, CRUD :
    @Stateless
    public class CrudServiceBean implements CrudService<Integer,Customer> {

    @PersistenceContext
    private EntityManager em;

    public Customer create(Customer t) {
    this.em.persist(t);
    return t;
    }

    public void delete(Customer t) {
    t = this.em.merge(t);
    this.em.remove(t);
    }

    public Customer find(Integer id) {
    return this.em.find(Customer.class, id);
    }

    public Customer update(Customer t) {
    return this.em.merge(t);
    }
    }
  19. …and they really work well: I’m using EJB 3.0 + JPA 1.0 since about 2 years in projects. It worked not only surprisingly well for me — the team members were surprised as well.

However there is still room for improvement in the Java EE 6 Platform. JMS spec could be easily redesigned to be more «fluent». The JNDI registry is archaic. Fixing/simplifying the JNDI-API would be really beneficial not only to EJBs, but for the whole platform as well…

From http://blog.adam-bien.com/