Ответ 1
Зачем ими пользоваться? (Почему бы просто не придерживаться POJO?)
ЕСЛИ вам нужен компонент, который обращается к базе данных или получает доступ к другим ресурсам подключений/каталогов или к ним обращаются от нескольких клиентов или предназначается как служба SOA, сегодня EJB обычно "больше, сильнее, быстрее (или, по крайней мере, более масштабируемым) и более простым, чем POJO. Они наиболее ценны для обслуживания большого числа пользователей через сеть или корпоративную сеть и несколько менее ценны для небольших приложений в отделе.
-
Повторное использование/совместное использование логики для нескольких приложений/клиентов с помощью Loose Coupling.
EJB могут быть упакованы в их собственные банки, развернуты и вызваны из большого количества мест. Они являются общими компонентами. Правда, POJO могут быть (тщательно!) Разработаны как библиотеки и упакованные как банки. Но EJB поддерживают как локальный, так и удаленный доступ к сети - в том числе через локальный интерфейс java, прозрачный RMI, асинхронное сообщение JMS и веб-сервис SOAP/REST, экономия от зависимостей jar-cut-and-paste с несколькими (непоследовательными?) развертываниями.
Они очень полезны для создания SOA-сервисов. При использовании для локального доступа они POJO (с добавлением бесплатных контейнерных услуг). Акт проектирования отдельного уровня EJB способствует особой осторожности для максимизации инкапсуляции, ослабления сцепления и сцепления и продвигает чистый интерфейс (Facade), защищая абонентов от сложной обработки и данных модели. -
Масштабируемость и надежность Если вы применяете огромное количество запросов от различных вызывающих сообщений/процессов /threads, они распределяются по доступным экземплярам EJB в пуле сначала а затем поставили в очередь. Это означает, что если количество входящих запросов в секунду чем сервер может обрабатывать, мы грамотно деградируем - всегда есть запросы обрабатываются эффективно и избыточные запросы сделаны для ожидания. Мы не достигают сервера "meltdown" - где ВСЕ запросы испытывают ужасное время отклика одновременно, плюс сервер пытается получить доступ к большему количеству ресурсов, чем оборудование и ОС может справиться и, следовательно, сбой. EJB могут быть развернуты на отдельном уровне, который может быть кластеризованный - это обеспечивает надежность при переходе с одного сервера на другой, плюс аппаратное обеспечение можно линейно масштабировать.
-
Concurrency Управление. Контейнер гарантирует, что экземпляры EJB будут автоматически доступны безопасно (последовательно) несколькими клиентами. Контейнер управляет пулом EJB, пулом потоков, очереди вызовов и автоматически выполняет блокировку записи на уровне метода (по умолчанию) или читать блокировку (через @Lock (READ)). Это защищает данные от коррупции через одновременные конфликты записи-записи и помогают постоянно считывать данные, предотвращая конфликты чтения-записи.
Это в основном полезно для сеанса @Singleton beans, где bean манипулирует и совместное использование общего состояния между вызывающими абонентами. Это можно легко переопределить вручную настраивать или программно управлять расширенными сценариями для одновременного выполнения кода и доступ к данным. -
Автоматическая обработка транзакций.
Ничего не делать, и все ваши EJB-методы запускаются в транзакции JTA. Если вы обращаетесь к базе данных с использованием JPA или JDBC, она автоматически зачислен в транзакцию. То же самое для JMS и JCA-вызовов. Указывать @TransactionAttribute (someTransactionMode) перед тем, как указать метод if/how конкретный метод участвует в транзакции JTA, переопределяя режим по умолчанию: "Обязательно". -
Очень простой доступ к ресурсам/зависимости через инъекцию.
Контейнер будет искать ресурсы и задавать ссылки на ресурсы как поля экземпляра в EJB: такие как JDDI-соединения JDBC, JMS-соединения/темы/очереди, другие EJB, JTA Transactions, контексты сохранения сущностей JPA, менеджер сущностей JPA factory единиц сохранения и ресурсов адаптера JCA. например для установки ссылки на другой EJB и транзакцию JTA и диспетчер сущностей JPA и соединение JMS factory и очередь:@Stateless public class MyAccountsBean { @EJB SomeOtherBeanClass someOtherBean; @Resource UserTransaction jtaTx; @PersistenceContext(unitName="AccountsPU") EntityManager em; @Resource QueueConnectionFactory accountsJMSfactory; @Resource Queue accountPaymentDestinationQueue; public List<Account> processAccounts(DepartmentId id) { // Use all of above instance variables with no additional setup. // They automatically partake in a (server coordinated) JTA transaction } }
Сервлет может вызвать этот bean локально, просто объявив переменную экземпляра:
@EJB MyAccountsBean accountsBean;
а затем просто называя его "методы" по желанию.
-
Интеллектуальное взаимодействие с JPA. По умолчанию EntityManager, введенный, как указано выше, использует постоянство транзакции контекст. Это идеально подходит для сеанса без состояния beans. Когда метод (безстоящий) EJB , в новой транзакции создается новый контекст постоянства, все экземпляры объектов объекта, извлеченные/записанные в БД, видны только в пределах этого вызов метода и изолированы от других методов. Но если другие EJB без гражданства вызываемый методом, контейнер распространяется и обменивается с ним одним и тем же ПК, так что объекты автоматически совместно используются совместно с ПК в одном и том же сделка.
Если объявлен сеанс @Stateful bean, равное умное сродство с JPA достигается объявляя entityManager расширенной областью действия: @PersistentContent (unitName = "AccountsPU, type = EXTENDED). Это существует для жизни сеанс bean, через несколько вызовов и транзакций bean, кэширование копий в памяти ранее созданных/записанных объектов БД, поэтому их не нужно повторно извлекать. -
Управление жизненным циклом. Жизненный цикл EJB управляется контейнерами. По мере необходимости он создает экземпляры EJB, очищает и инициализирует сеанс состояния с состоянием bean, пассивит и активирует, и вызывает методы обратного вызова жизненного цикла, поэтому код EJB может участвовать в операциях жизненного цикла для приобретать и выпускать ресурсы, а также выполнять другие операции инициализации и выключения. Он также фиксирует все исключения, регистрирует их, откатывает транзакции по мере необходимости и выдает новые исключения EJB или @ApplicationExceptions по мере необходимости.
-
Управление безопасностью. Управление доступом на основе ролей к EJB можно настроить с помощью простой аннотации или XML установка. Сервер автоматически передает аутентифицированные данные пользователя вместе с каждым вызов в качестве контекста безопасности (вызывающий директор и роль). Это гарантирует, что все RBAC правила автоматически применяются, так что методы не могут быть незаконно вызваны неправильная роль. Это позволяет EJB легко получить доступ к деталям пользователя/роли для дополнительных программных проверка. Это позволяет подключать дополнительную обработку безопасности (или даже инструменты IAM) к контейнер стандартным образом.
-
Стандартизация и переносимость. Реализации EJB соответствуют стандартам Java EE и соглашениям о кодировании, способствуя качеству и легкость понимания и обслуживания. Это также способствует переносимости кода на новый серверов поставщиков приложений, гарантируя, что они поддерживают одни и те же стандартные функции и поведения, а также препятствуя тому, чтобы разработчики случайно использовали проприетарные непереносимые функции поставщика.
-
Настоящий кикер: простота. Все это можно сделать с помощью очень обтекаемый код - либо с использованием настроек по умолчанию для EJB в Java EE 6 или добавление нескольких аннотаций. кодирование возможности предприятия/промышленной силы в ваших собственных POJO быть более утомительным, сложным и подверженным ошибкам. Однажды ты начать кодирование с помощью EJB, они довольно просты в разработке и дают отличный набор преимуществ "бесплатной езды".
В оригинальной спецификации EJB 10 лет назад EJB были большой проблемой производительности. Они раздувались, нуждались в множестве кодовых и конфигурационных артефактов и предоставляли около 2/3 преимуществ выше. Большинство веб-проектов фактически не использовали их. Но это значительно изменилось с 10-летней настройкой, капитальным ремонтом, улучшением функциональных возможностей и развитием. В Java EE 6 они обеспечивают максимальную промышленную прочность и простоту использования.
Что не нравится?:-): -)