Главная » Spring » Разработка компонентов с поддержкой Spring (EJB 2.x)

0

Фреймворк Spring предоставляет массу возможностей для разра- ботки корпоративных приложений без использования компонентов EJB, тем не менее, у вас все еще может возникать необходимость создавать собственные компоненты EJB.

В главе 11 демонстрировалось, как компоненты-экспортеры, вхо- дящие в состав Spring позволяют превратить любой POJO в удален- ную службу. Я очень не хочу разочаровывать вас, но, к сожалению, фреймворк Spring не содержит класса EjbServiceExporter, который экспортировал бы объекты POJO как компоненты EJB. (Но я со- глашусь, что иметь такой класс было бы здорово.)

Однако, как бы то ни было, фреймворк Spring помогает немного облегчить разработку компонентов EJB. В состав Spring входят че- тыре абстрактных класса, которые привносят обычные компоненты EJB в мир Spring:

#  AbstractMessageDrivenBean – может пригодиться для разработки

компонентов, управляемых сообщениями, которые принимают сообщения из источников, отличных от JMS (согласно специ- фикации EJB 2.1);

# AbstractJmsMessageDrivenBean – может пригодиться для разработ-

ки компонентов, управляемых сообщениями, которые прини- мают сообщения из JMS-источников;

# AbstractStatefulSessionBean – может пригодиться для разработки

сеансовых компонентов EJB с поддержкой информации о со- стоянии;

# AbstractStatelessSessionBean – может пригодиться для разработ-

ки сеансовых компонентов EJB, не поддерживающих инфор- мацию о состоянии.

Эти абстрактные классы упрощают разработку компонентов EJB двумя способами.

# Предоставляют пустые реализации методов управления жиз- ненным циклом EJB (например, ejbActivate(), ejbPassivate(), ejbRemove()). Спецификация EJB требует наличия этих мето- дов, но обычно они имеют пустые реализации.

# Предоставляют доступ к фабрике компонентов Spring. Это по-

зволяет реализовать компоненты EJB, делегирующие реали- зацию прикладной логики объектам POJO, сконфигурирован- ным в контексте Spring. Фактически компонент EJB может яв- ляться лишь фасадом для объектов POJO в контексте Spring.

Для примера предположим, что необходимо экспортировать функ- циональность компонента rantService в виде сеансового компонента EJB без поддержки информации о состоянии. В листинге 16.1 по- казано, как может выглядеть реализация такого компонента EJB.

Листинг 16.1. Сеансовый компонент EJB без поддержки информации о состоянии, делегирующий реализацию прикладной логики объекту POJO в Spring

package com.roadrantz.ejb; import   java.util.Date; import    java.util.List;

import   javax.ejb.CreateException;

import   org.springframework.ejb.support.AbstractStatelessSessionBean; import com.roadrantz.domain.Motorist;

import   com.roadrantz.domain.Rant; import   com.roadrantz.domain.Vehicle;

import  com.roadrantz.service.MotoristAlreadyExistsException; import   com.roadrantz.service.RantService;

public class RantServiceEjb

extends    AbstractStatelessSessionBean implements RantService {

public  RantServiceEjb()  {}

private RantService rantService;

protected  void  onEjbCreate()  throws  CreateException  {

rantService  =  (RantService)                        // Поиск  службы  оповещения getBeanFactory().getBean("rantService");

}

public  void  addMotorist(Motorist  motorist)  throws MotoristAlreadyExistsException {

rantService.addMotorist(motorist);

}

// Следующие методы делегируют выполнение прикладной логики объекту POJO public   void   addRant(Rant   rant)   {

rantService.addRant(rant);

}

public List<Rant> getRantsForDay(Date date) { return   rantService.getRantsForDay(date);

}

public List<Rant> getRantsForVehicle(Vehicle vehicle) { return rantService.getRantsForVehicle(vehicle);

}

public List<Rant> getRecentRants() { return rantService.getRecentRants();

}

public void sendDailyRantEmails() { rantService.sendDailyRantEmails();

}

public void sendEmailForVehicle(Vehicle vehicle) { rantService.sendEmailForVehicle(vehicle);

}

}

После создания экземпляра RantServiceEjb его метод onEjbCreate() извлечет компонент rantService из фабрики компонентов Spring. За- тем, когда будет вызван какой-либо из методов, он вызовет соответ- ствующий метод компонента rantService, как показано на рис. 16.4.

Листинг 16.1 не дает ответа на один большой вопрос – откуда берется ссылка на фабрику компонентов. В типичной манере для JEE абстрактные классы компонентов EJB извлекают фабрику ком- понентов из JNDI. По умолчанию они пытаются отыскать фабрику компонентов по имени java:comp/env/ejb/BeanFactoryPath. Это означа- ет необходимость настройки в JNDI фабрики компонентов с этим именем.

Если у вас фабрика компонентов хранится в JNDI с другим име- нем, определите свойство beanFactoryLocatorKey перед загрузкой фаб- рики компонентов (либо в конструкторе, либо в методе setSession- Context()).  Например:

Рис. 16.4. Поддержка создания компонентов EJB в Spring имеет форму абстрактных классов, позволяющих разрабатывать компоненты EJB, имеющие доступ к контексту приложения Spring

(хранящемуся в JNDI)

public  void  setSessionContext(SessionContext  sessionContext)  { super.setSessionContext(sessionContext);

setBeanFactoryLocatorKey("java:comp/env/ejb/SpringContext");

}

При такой реализации метода setSessionContext() контекст Spring должен храниться в JNDI с именем java:comp/env/ejb/SpringContext.

Поддержка разработки компонентов EJB в Spring основана на спецификациях EJB 2.x. Однако спецификация EJB 3 содержит су- щественные изменения. Чтобы упростить разработку компонентов EJB, спецификация EJB 3 заимствовала из Spring некоторые идеи, такие как внедрение зависимостей и аспектно-ориентированное про- граммирование. Поэтому далее познакомимся со спецификацией EJB 3 поближе и посмотрим, как она совмещается с фреймворком Spring.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии