Introduzione

Spring è nato in parte come risposta all'estrema complessità delle tecnologie Java EE standard. La tecnologia EJB introduce varie problematiche che la comunità di sviluppatori ha cercato di affrontare introducendo regole codificate in un insieme apposito di "design pattern", raccolti sotto la denominazione di "J2EE Core Patterns". Studiando questi pattern ci si rende conto che la mole di problemi supera in qualche modo i vantaggi, e lo sforzo nel lavoro di modellazione che occorre fare per superare tali problemi è eccessivo. Può essere una buona scelta quindi utilizzare la leggerezza di Spring per sviluppare il proprio sistema. Tuttavia spesso i lavori che il mercato offre riguardano componenti da integrare in un "ecosistema" informatico più vasto, con forti problematiche di integrazione. Gli EJB sono molto diffusi e non sarà raro avere la necessità di accedere nella propria "porzione" di sistema a funzionalità sviluppate con essi. Spring permette un accesso trasparente agli EJB, sotto forma di beans configurati nell'ApplicationContext. Nel prossimo paragrafo vedremo come accedere agli EJB, mentre nel successivo si descriveranno delle classi di supporto che permettono di scrivere degli EJB che abbiano accesso alle funzionalità di Spring.

Accedere agli EJB

Come per gli altri casi di integrazione di componenti remoti, il meccanismo utilizzato per consentire l'accesso agli EJB è quello di sfruttare le caratteristiche AOP per generare dei proxy che implementino le stesse interfacce degli EJB, e quindi consentano di effettuare delle chiamate ai metodi relativi risparmiando tutta la mole di codice che normalmente viene scritta per effettuare il "lookup" della interfaccia "home", ottenere l'EJB e gestire le possibili eccezioni. Esistono due classi che permettono di generare dei proxy per interfacciare EJB rispettivamente locali e remoti:

1. LocalStatelessSessionProxyFactoryBean 2. SimpleRemoteStatelessSessionProxyFactoryBean

Ecco un esempio di configurazione per un EJB locale:

<bean id="myEjbService"
  class="org.springframework.ejb.access.LocalStatelessSessionProxyFactoryBean"
  lazy-init="true">
  <property name="jndiName">
    <value>myEjb</value>
  </property>
  <property name="businessInterface">
    <value>esempio.MyEjb</value>
  </property>
</bean>

E poi possiamo iniettarlo in un altro bean:

<bean id="myService" class="esempio.MyServiceImpl">
  ...
  <property name="myEjbService">
    <ref bean="myEjbService"/>
  </property>
  ...
</bean>

Per un EJB remoto, la configurazione è analoga:

<bean id="myEjbService"
  class="org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean"
  lazy-init="true">
  <property name="jndiName">
    <value>myEjb</value>
  </property>
  <property name="businessInterface">
    <value>esempio.MyEjb</value>
  </property>
</bean>

Sviluppare EJB con Spring

È possibile anche sviluppare EJB che utilizzino le funzionalità di Spring. Ecco un esempio:

public class MyEjb extends AbstractStatelessSessionBean implements MyService {
  private MyService myService;

  protected void onEjbCreate() {
    myService = (MyService) getBeanFactory().getBean("myService");
  }

  public Course doSomething() {
    return myService.doSomething();
  }
}