Сравнительная характеристика программных технологий Spring Framework и Enterprise Java Beans

Spring и EJB имеют много различий. Прежде всего, EJB – это спецификация, а Spring – это имплементация. Эти две технологии используют совершенно разный структурный подход. Spring framework строится на базе инверсии зависимостей контейнера и является многослойной платформой разработки корпоративных приложений. EJB имеет компонентную архитектуру. Обе технологии могут сравниваться, поскольку Spring framework был разработан как альтернатива EJB.

Обе платформы имеют широкую поддержку технологий объектно-реляционной привязки. Spring framework не предоставляет своей имплементации, однако обладает тесной интеграцией с популярными ORM (Object-relational mapping) фреймворками, такими как Hibernate, JDO, iBatis и Java persistence API (JPA). В то же время EJB явно работает только с JPA, однако JPA в свою очередь является спецификацией и множество платформ имеют ее поддержку. И их число входят Hibernate, Kodo, TopLink и другие.

Схема данных разрабатываемого для хостинг-провайдера приложения представляет собой сложный граф объектов. Если при запросе объекта выбирать из базы данные обо всех связях объекта, то ресурсы расходуются крайне нерационально. Для решения этой проблемы используются «ленивые» запросы. То есть данные получаются из БД по мере необходимости. Проблема состоит в том, что для того, чтобы выполнить «ленивый» запрос, сессия БД должна быть все еще открыта после извлечения основного объекта. Подход Spring – открывать и закрывать сессию во время формирования вида (используется шаблон Model-View-Controller). Для этого предусмотрен класс OpenSessionViewFilter. Подход EJB состоит в выделении дополнительных границ видимости для контекста хранимых данных, что позволяет привязать время жизни сессии к времени жизни объекта.

Важным моментом в разработке Интернет-приложения хостинг-провайдера является управление транзакциями. Его важность обусловлена тем, что в высоконагруженных приложениях вероятность того, что данные будут одновременно изменяться несколькими пользователями, достаточно высока. Для обеспечения работы с транзакциями Spring использует принцип аспектно-ориентированного программирования. Описание прокси-классов могут быть выполнены с помощью xml файлов, а так же используя аннотации. Пример использования аннотаций для управления транзакциями проиллюстрируем следующим фрагментом кода:

 1: package me.oleynikovav.purchaseservice.manager .impl;
 2: import me.oleynikovav.purchaseservice. dao.AccountDao;
 3: import me.oleynikovav.purchaseservice.domain.Account;
 4: import me.oleynikovav.purchaseservice.manager.AccountManager;
 5: import me.oleynikovav.purchaseservice.manager.ApplicationManager;
 6: import org.apache.commons.logging.Log;
 7: import org.apache.commons.logging.LogFactory;
 8: import org.springframework.beans.factory.annotation.Autowired;
 9: import org.springframework.context.annotation.Lazy;
 10: import org.springframework.stereotype. Service;
 11: import org.springframework.transaction.annotation.Propagation;
 12: import org.springframework.transaction.annotation.Transactional;
 13: @Service //Объявление класса как компонент. Контейнер управляет экземплярами данного класса
 14: @Lazy //Указание контейнеру не создать экземпляр класса по мере надобности, а не в момент иницилизации
 15: public class AccountManagerImpl extends GenericDaoManagerImpl<Account, Long> implements AccountManager { private static Log LOG = LogFactory.getLog(AccountManagerImpl.class);
 16: @Autowired
 17: private AccountDao dao; //Использование аннотаций для получения конмпонентов из контейнера @Autowired
 18: protected ApplicationManager applicationManager; @Override
 19: @Transactional(propagation = Propagation.REQUIRED) //Использование прокси для управления транзакцией.
 20: public void changePassword(String userName, String password, String appName, String newPassword) { applicationManager.getValidApplication(appName);
 21: Account account = getAuthorizedAccount(userName, password, appName); account.setPassword(newPassword); saveOrUpdate(account); if (LOG.isTraceEnabled()) {
 22: LOG.trace("Password changed for account: " + account.toString());
 23: }
 24: }
 25: }

Управление транзакциями в EJB привязано к менеджеру ресурсов, потому подход к обработке транзакций определяется видом ресурсов, обращение к котором производится.

Поддержка состояний является важным элементов приложения хостинг-провайдера, поскольку взаимодействие с клиентом часто выполняется в несколько шагов. При регистрации в системе заполняется несколько форм, а затем требуется объединить информацию со всех форм, заполненных пользователем. Подходы Spring и EJB в реализации данной функции существенно отличаются друг от друга. EJB предлагает механизм Stateful Session Bean (SFSB), который позволяет сохранять состояние объекта между запросами. Этот подход позволяет оптимизировать производительность сервера путем балансирования данных SFSB между оперативной памятью и жестким диском. Недостатком такого подхода является то, что он не так хорошо подходит для приложений, развернутых на нескольких серверах одновременно. Spring framework не имеет эквивалентного механизма, однако позволяет сохранять информацию между запросами, используя БД, сессию HTTP или кэшпамять.

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

%d такие блоггеры, как: