В 2002 году Марк Флери написал заслуживающую внимания Голубую книгу «Почему я люблю EJB» ( скачать ), что на тот момент было действительно удивительно. В то время я уже работал с EJB, но на самом деле не очень их любил :-). Я бы тоже не сказал «любовь», но мне действительно нравится EJB 3.0. Причины:
- Слишком низкая производительность. В Glassfish v2 только около 3% .
- EJB 3.0 — это сохранение потоков. Это огромное преимущество. Каждый поток получает собственный экземпляр — также все внедренные ресурсы (Entity Manager, Data Source, JMS) также сохраняются в потоке. Лучше всего: контейнер управляет ресурсами для вас. Требуется только аннотация (@EJB для EJB, @PersistenceContext для постоянства и @Resource для оставшихся ресурсов :-)). Просто попробуйте это с » простым старым веб-контейнером » :-). Подсказка: сервлеты являются небезопасными синглетонами.
- EJB 3.0 являются транзакционными . Таким образом, в случае успешного вызова метода все ресурсы будут синхронизированы (данные записываются в БД, сообщения отправляются на сервер). Контейнер делает это за вас — вы знаете только то, чего хотели бы достичь (это не зависит от платформы, но иногда достаточно сложно :-))
- Во всех моих проектах мы избавляемся от дескрипторов развертывания и используемых аннотаций. Был развернут только бережливый файл persistence.xml. Рефакторинг, развертывание и переносимость работали хорошо.
- EJB 3.0 действительно переносимы (и поэтому не зависят от вендора, фреймворка). Задано гораздо больше, чем EJB 2.1 дней — так что собственные дескрипторы развертывания больше не нужны. На самом деле дескрипторы не нужны. Вам нужно только развернуть один чистый jar с persistence.xml в meta-inf. Все остальное необязательно (и как-то подозрительно).
- Синергия между соглашением над конфигурацией (или официально: конфигурация с помощью исключения) и внедрением зависимости является отличной. На самом деле в большинстве случаев вы получаете с EJB-кодом меньше кода, чем без (без «новых» вызовов, только объявления).
@Stateless
public class SampleBean implements Sample {
@PersistenceContext
private EntityManager em;
@EJB
private Another anotherBean; - Методы получения и установки являются необязательными: для EJB, а также для JPA. Это твое решение. Ресурсы могут быть непосредственно введены в поля.
- Настройки по умолчанию и настройки аннотаций могут быть отменены XML-дескрипторами. Дескрипторы XML не обязательно должны быть полными — можно указывать только интересные части. Вы можете легко изменить настройки производства, например, для постановки (тестирование, интеграция и т. Д.).
- На самом деле специальных инструментов не требуется. Вам нужны только аннотации, компилятор Java 6 и Jar. Однако поддержка в IntelliJ, Eclipse (с 500 дополнительными плагинами :-)) или Netbeans 6.1 действительно превосходна. Серверы приложений уже хорошо интегрированы — управление развертыванием, отключением, настройкой и т. Д. Может осуществляться непосредственно из IDE.
- EJB 3.1 будет встраиваемым из коробки. Однако Glassfish v3 уже готов к употреблению. Сейчас я тестирую WebContainer — это удивительно (начинается через 500 мс). JBoss также встраиваемый.
- EJB 3.1 будет иметь много полезных функций: Singletons (подходит для конфигурации, классов запуска и т. Д.), Улучшенную поддержку таймера (cron-like), асинхронные методы с Futures, дополнительные локальные интерфейсы и WAR-развертывание.
- Настройки пула и конфигурация пула потоков действительно полезны для управления масштабируемостью (и не масштабируются бесконечно, пока контейнер не рухнет :-))
- Они хорошо играют со скриптами (JavaScript, Groovy и т. Д.)
- EJB по умолчанию являются управляемыми и контролируемыми. Вы просто развертываете их в контейнере — и вы можете отслеживать вызовы методов, производительность и т. Д.
- Никаких дополнительных платформ, библиотек и т. Д. В первую очередь не требуется. В ejb-jar и контейнере содержится только код вашего приложения. Таким образом, NoClassDefFoundErrors, ClassCastExceptions и т. Д. Могут быть сведены к минимуму.
- EJB 3.0 ультра-худой. Вы на самом деле не можете что-то забрать :-). Тем не менее: я открыт для предложений.
- Их действительно легко протестировать — это просто класс с интерфейсом. Вы даже можете запустить их вне контейнера.
- Даже простые варианты использования могут быть эффективно реализованы с помощью 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);
}
} - …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…