Где использовать EJB 3.1 и CDI?
Я делаю продукт на основе Java EE, в котором я использую GlassFish 3 и EJB 3.1.
Мои приложения сессии бобы планировщик и использует веб-сервисы. Я недавно узнал о Apache TomEE, которая обслуживает контексты и инъекции зависимостей (CDI). Контейнер GlassFish также поддерживает CDI.
могу ли я заменить сеансовые бобы, где мне не требуется какая-либо функция, которую CDI также еще не использует обеспечивает? И если да, то какие преимущества я могу получить?
2 ответов:
Да, вы можете свободно смешать и CDI и EJB и достигнуть некоторых больших результатов. Похоже, вы используете
@WebServiceи@Schedule, которые являются вескими причинами для добавления EJB в микс.там много путаницы, так что вот некоторые общие сведения о EJB и CDI, как они относятся друг к другу вместе.
EJB >= CDI
обратите внимание, что EJBs are фасоли CDI и поэтому имеют все преимущества CDI. Обратное не верно (еще.) Чтобы наверняка не попасть в привычку думать "и EJB против МОДЦ" как эта логика действительно переводится как "объект+против КДИ ЦДИ", который представляет собой странное уравнение.
в будущих версиях Java EE мы будем продолжать выравнивать их. То, что выравнивание означает, позволяет людям делать то, что они уже могут сделать, просто без
@Stateful,@Statelessили@SingletonАннотация В верхней части.EJB и CDI в условиях реализации
в конечном счете, EJB и CDI разделяют то же самое фундаментальный дизайн проксируемых компонентов. Когда вы получаете ссылку на Боб EJB или CDI, это не настоящий Боб. Скорее объект, который вам дают, является подделкой (прокси). Когда вы вызываете метод на этом поддельном объекте, вызов переходит к контейнеру, который отправит вызов через перехватчики, декораторы и т. д. а также позаботьтесь о любых транзакциях или проверках безопасности. После того, как все это будет сделано, вызов, наконец, переходит к реальному объекту, и результат передается обратно через прокси-сервер абонент.
разница заключается только в том, как разрешен вызываемый объект. Под "разрешенным" мы просто подразумеваем, где и как контейнер ищет реальный экземпляр для вызова.
в CDI контейнер выглядит в "области видимости", которая в основном будет хэш-картой, которая живет в течение определенного периода времени (на запрос
@RequestScoped, за сеанс HTTP@SessionScoped, в приложении@ApplicationScoped, JSF разговор@ConversationScoped, или в вашей пользовательской реализации области).In EJB контейнер также выглядит в hashmap, если Боб имеет тип
@Stateful. Ан@Statefulbean также может использовать любую из приведенных выше аннотаций области, заставляя ее жить и умирать со всеми другими бобами в области. В EJB@Statefulпо сути "любого уровня" бином. Элемент@Statelessв основном пул экземпляров -- вы получаете экземпляр из пула в течение одного вызова. Элемент@Singletonпо сути@ApplicationScopedИтак, на фундаментальном уровне все, что вы можете сделать с "EJB" фасоль вы должны быть в состоянии сделать с "CDI" фасоль. Под одеялом их очень трудно отличить друг от друга. Вся сантехника одинакова, за исключением того, как разрешаются экземпляры.
в настоящее время они не совпадают с точки зрения услуг, которые контейнер будет предлагать при выполнении этого проксирования, но, как я уже сказал, Мы работаем над этим на уровне спецификаций Java EE.
примечание по производительности
игнорируйте любые" легкие "или" тяжелые " ментальные образы, которые у вас могут быть. Вот и все маркетинг. Они имеют одинаковый внутренний дизайн по большей части. Разрешение экземпляра CDI, возможно, немного сложнее, потому что оно немного более динамично и контекстуально. Разрешение экземпляра EJB довольно статично, глупо и просто по сравнению.
я могу сказать вам с точки зрения реализации в TomEE, есть примерно нулевая разница в производительности между вызовом EJB и вызовом CDI-компонента.
по умолчанию POJOs, затем CDI, затем EJB
Of конечно, не используйте CDI или EJB, когда нет никакой пользы. Бросьте в CDI, когда вы начинаете хотеть инъекции, события, перехватчики, декораторы, отслеживание жизненного цикла и тому подобное. Это самое подходящее время.
помимо этих основ, есть ряд полезных контейнерных сервисов, которые вы можете использовать только в том случае, если вы сделаете свой CDI bean также EJB, добавив
@Stateful,@Statelessили@Singletonна нем.вот краткий список, когда я выламывал компоненты EJB.
с помощью JAX-WS
разоблачение JAX-WS
@WebService. Я ленивый. Когда@WebServiceтакже является EJB, вам не нужно перечислять его и сопоставлять его как сервлет в . Для меня это работа. Кроме того, я получаю возможность использовать любую из других функций, упомянутых ниже. Так что для меня это не проблема.доступна
@Statelessи@Singletonтолько.используя JAX-RS
выставление ресурса JAX-RS через
@Path. Я все еще ... ленивый. Когда RESTful service также является EJB, вы снова получаете автоматическое обнаружение и не должны добавлять его в JAX-RSApplicationподкласс или что-нибудь в этом роде. Плюс я могу выставить тот же самый боб, что и@WebServiceЕсли я хочу или использовать любую из больших функциональных возможностей, упомянутых ниже.доступна
@Statelessи@Singletonтолько.запуск логики
загрузка при запуске через
@Startup. В настоящее время в CDI нет эквивалента этому. Как-то мы пропустили добавление чего-то вродеAfterStartupсобытие в жизненном цикле контейнер. Если бы мы сделали это, вы просто могли бы@ApplicationScopedбоб, который слушал его, и это было бы эффективно то же самое, что и@SingletonС@Startup. Это в списке для CDI 1.1.доступна
@Singletonтолько.работает параллельно
@Asynchronousвызов метода. Запуск потоков-это нет-нет в любой серверной среде. Слишком много потоков-это серьезная производительность убийца. Эта аннотация позволяет вам распараллеливать то, что вы делаете, используя пул потоков контейнера. Это потрясающе.доступна
@Stateful,@Statelessи@Singleton.составление графиков работы
@ScheduleилиScheduleExpressionэто в основном cron илиQuartzфункциональность. Также очень удивительным. Большинство контейнеров просто используют кварц под крышками для этого. Однако большинство людей не знают, что планирование работы в Java EE является транзакционным! При обновлении базы данных затем запланируйте некоторые работы, и один из них не удастся, оба будут автоматически очищены. ЕслиEntityManagerpersist вызов не удается или есть проблема промывки, нет необходимости, чтобы отменить график работы. Ура, сделки.доступна
@Statelessи@Singletonтолько.использование EntityManagers в транзакции JTA
вышеуказанное примечание о транзакциях, конечно, требует от вас использовать
JTAуправлялEntityManager. Вы можете использовать их с простым "CDI", но без управляемые контейнером транзакции он может получить действительно монотонное дублированиеUserTransactionлогика фиксации/отката.доступно для всех компонентов Java EE, включая CDI, JSF
@ManagedBean,@WebServlet,@WebListener,@WebFilterи т. д. Элемент@TransactionAttributeаннотация, однако, доступна для@Stateful,@Statelessи@Singletonтолько.удержание JTA управляемым
EntityManagerThe
EXTENDEDуправлялEntityManagerпозволяет сохранитьEntityManagerмеждуJTAоперации и не сбросить кэшированные данные. Хорошая функция для правильного времени и места. Используйте ответственно :)доступна
@Statefulтолько.простая синхронизация
когда вам нужна синхронизация, то
@Lock(READ)и@Lock(WRITE)аннотации довольно отлично. Это позволяет получить одновременное управление доступом бесплатно. Пропустить все ReentrantReadWriteLock сантехника. В том же ведре находится@AccessTimeout, что позволяет сказать, как долго поток должен ждать, чтобы получить доступ к экземпляр Bean, прежде чем сдаться.доступна
@Singletonтолько бобы.
Если вы действительно не используете ни одну из функций ejb 3.1 ответ прост. но угадайте, что ваш вопрос указывает на то, что вы подозреваете, что есть концепции ejb 3.1, которые вы получаете, не зная о них. одним из примеров может быть то, что контейнер может держать пул slsb готовым к использованию, так что JMS и соединения с базой данных не должны вводиться как часть запроса
Comments