`
yangzb
  • 浏览: 3506466 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ejb Con Spring

阅读更多

Contenido

[ocultar]

<script type="text/javascript"></script>

[editar] Creación en EJB 2.x

Spring provee una forma simple y cómoda para crear EJBs de Stateless, Stateful y Message Driven Bean. Esto se hace heredando la implementación de los EJB de alguna de estas clases:

  • Abstract Stateless Session Bean
  • Abstract Stateful Session Bean
  • Abstract Message Driven Bean

Estas clases proveen varios beneficios:

  • proveen acceso a un factory de Spring ya inicializado
  • implementan ya varios métodos obligatorios de EJB

Las clases brindan un factory de Spring ya creado e inicializado, el cual se accede a través del método heredado getBeanFactory(). Este factory se configura a través de variables de entorno en el archivo ejb-jar.xml.

El método ejbCreate() se encuentra implementado (para poder inicializar el factory y otras tareas). Spring provee el método onEjbCreate() el cual implementaremos para inyectar "a mano" las dependencias de nuestro EJB.

[editar] Ejemplo de creación de un EJB Stateless

Supondremos que ya contamos con un objeto de negocio FlotaEspacialBO de la siguiente forma:

public class FlotaEspacialBoImpl implements FlotaEspacialBo {
     public Collection<Invasor> buscarInvasores(Long idFlota) {
         ... buscar los invasores de la flota indicada ...
     }
 }

Expondremos este EJB (el cual lo tenemos ya declarado en Spring) usando un EJB Stateless. Para el EJB crearemos todas las interafaces necesarias (Home, Remote, Local, etc). La diferencia estará en el bean:

public class FlotaEspacialBean extends AbstractStatelessSessionBean {
 
     private FlotaEspacialBo flotaEspacialBo;
 
     public Collection<Invasor> buscarInvasores(Long idFlota) {
          return flotaEspcialBo.buscarInvasores(idFlota);
     }
 
     @Override
     protected void onEjbCreate() throws CreateException {
         flotaEspcialBo = (FlotaEspacialBo) getBeanFactory().getBean("business.FlotaEspacialBo");
     }
 }

Como se ve, el bean hereda de !AbstractStatelessSessionBean, clase que ya provee varios métodos implementados para los EJB. Así, el EJB queda muy simple, invocando al objeto de negocio directamente para resolver la lógica. El método onEjbCreate() se encarga de inyectar las dependencias del EJB utilizando el método getBeanFactory() que viene heredado.

Falta entonces indicarle a Spring los archivos de configuración que deberá levantar el factory, lo cual va en el ejb-jar.xml

<ejb-jar>
    <enterprise-beans>
        <session>
            <ejb-name>FlotaEspacialBean</ejb-name>
            <home>com.dosideas.business.ejb.flota.FlotaEspacialRemoteHome</home>
            <remote>com.dosideas.business.ejb.flota.FlotaEspacialRemote</remote>
            <ejb-class>com.dosideas.business.ejb.flota.FlotaEspacialBean</ejb-class>
            <session-type>Stateless</session-type>
            <transaction-type>Container</transaction-type>
            <env-entry>
                <env-entry-name>ejb/BeanFactoryPath</env-entry-name>
                <env-entry-type>java.lang.String</env-entry-type>
                <env-entry-value>application-ejb.xml,application-negocio.xml</env-entry-value>
            </env-entry>
        </session>
    </enterprise-beans>
 </ejb-jar>

Los tag env-entry contienen la ubicación de los archivos de Spring para inicializar.

[editar] Creación en EJB 3.x

EJB 3 contiene muchas mejoras y simplificaciones al momento de crear EJBs. Integrar EJB3 y Spring es una tarea muy sencilla, que se resuelve con el uso de Anotaciones.

import javax.interceptor.Interceptors;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.ejb.interceptor.SpringBeanAutowiringInterceptor;
 
 @Stateless
 @Interceptors(SpringBeanAutowiringInterceptor.class)
 public class PaisSessionBeanBean implements PaisSessionBeanRemote {
    @Autowired
    private PaisBo paisBo;
 
    public Pais buscarPaisPorId(Long id) {
        return paisBo.buscarPaisPorId(id);
    }
 }

La anotacion @Interceptors(SpringBeanAutowiringInterceptor.class) prepara un factory para ser usado en el EJB. A su vez, se encarga de inyectar todos los atributos marcados con @Autowired.

El interceptor busca un archivo beanRefContext.xml en el classpath, que contenga una instancia de un ApplicationContext, el cual referencia a los archivos de Spring a cargar. Por ejemplo:

<?xml version="1.0" encoding="UTF-8"?>
 <beans>
    <bean name="applicationContext-main" class="org.springframework.context.support.ClassPathXmlApplicationContext">
        <constructor-arg>
            <list>
                <value>application-business.xml</value>
                <value>application-dao.xml</value>
                <value>application-db.xml</value>
                <value>application-hibernate.xml</value>
            </list>
        </constructor-arg>
    </bean>
 </beans>

[editar] Acceso de EJBs

Uno de los usos más interesantes es la posibilidad de dejar a Spring realizar el lookup del EJB e inyectar la interfaz de negocio directamente en nuestros objetos.

Así, delegamos a Spring la localización y creación del EJB.

Para esto, se utilizan 2 clases principales:

  • JndiTemplate, que contiene la información para realizar la búsqueda del EJB.
  • En el caso de EJB 2.x, usaremos la clase SimpleRemoteStatelessSessionProxyFactoryBean, que realizará la instanciación de nuestro EJB. Este Proxy será el que inyectaremos en nuestros otros beans.
  • En el caso de EJB 3.x, usaremos la clase JndiObjectFactoryBean, que realizará la búsqueda del EJB. Este proxy será el que inyectaremos en nuestros beans.

[editar] Ejemplo de acceso a EJB 2.x

Este ejemplo funciona con EJB 2.x.

[editar] El EJB

Supongamos que tenemos un EJB llamado PersonaServiceBean. Esta EJB está compuesto de las siguiente clases:

  • com.dosideas.business.ejb.persona.PersonaServiceRemote (interfaz de negocio remota)
  • com.dosideas.business.ejb.persona.PersonaServiceBean (implementación del EJB)

[editar] Archivo de configuración de Spring

En un archivo de Spring, podemos declarar una referencia a nuestro EJB, que luego podremos inyectar como un bean normal.

<?xml version="1.0" encoding="UTF-8"?>
 <beans>
    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate"/>
 
    <bean id="ejb.PersonaServiceBean" 
          class="org.springframework.ejb.access.SimpleRemoteStatelessSessionProxyFactoryBean">
        <property name="jndiName">
            <value>ejb/PersonaServiceBean</value>
        </property>
        <property name="jndiTemplate">
            <ref local="jndiTemplate"/>
        </property>
        <property name="businessInterface">
            <value>com.dosideas.business.ejb.persona.PersonaServiceRemote</value>
        </property>
    </bean>
 </beans>

El bean con id ejb.PersonaServiceBean es un proxy que cumple con la interfaz indicada en el atributo "businessInterface". En el ejemplo, se declaró la interfaz de negocio remota del EJB. Este bean puede ya ser inyectado en cualquier otro lado y utilizado normalmente.

Spring realizará la creación del bean igual que con el resto de los objetos. En este caso, al iniciarse el factory de Spring se realizará el lookup e instanciación correspondiente del EJB. Es posible demorar esta acción con los medios tradicionales que provee Spring (lazy-init, etc.).

[editar] El atributo businessInterface

El atributo businessInterface indica la interfaz que implementará el Proxy de Spring. Un detalle interesante es que esta interfaz no tiene porqué ser la interfaz de negocio del EJB.

Así, podriamos crear una interfaz "nuestra", que cumpla con los métodos que están en la interfaz de negocio del EJB. De esta manera, nuestra aplicación queda independiente de cambios en la interfaz del EJB (y la posiblidad, además, de intercambiar libremente entre interfaces remotas y locales del EJB).

[editar] Ejemplo de acceso a EJB 3.x

Este ejemplo funciona con EJB 3.x.

[editar] El EJB

Supongamos que tenemos un EJB llamado PersonaServiceBean. Esta EJB está compuesto por la siguiente interfaz:

  • com.dosideas.business.ejb.persona.PersonaServiceRemote (interfaz de negocio remota)

 

[editar] Archivo de configuración de Spring

En un archivo de Spring, podemos declarar una referencia a nuestro EJB, que luego podremos inyectar como un bean normal.

<?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
 
    <bean id="jndiTemplate" class="org.springframework.jndi.JndiTemplate" />
 
    <bean id="ejb.PersonaServiceBean" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName" value="ejb/PersonaServiceBean"/>
    </bean>
 </beans>

Una forma alternativa es utilizando los tags propios para jee que trae Spring.

<jee:jndi-lookup id="ejb.PersonaServiceBean" jndi-name="ejb/PersonaServiceBean" cache="true" />

[editar] Reconexión automática de EJBs

Si por algún motivo se reinicia el servidor de EJBs, podría ser necesario reiniciar también a los clientes.

Podemos usar el atributo refresh-home-on-connect-failure para forzar una nueva búsqueda de nuestro cliente en el caso de un error de conexión. Para EJB 3.0, esto funciona a partir de Spring 2.5.5 (ya que las versiones anteriores contenían un bug).

<jee:remote-slsb id="miServicio" jndi-name="ejb/MiServicio"  
    business-interface="com.dosideas.business.ejb.MiServicio"  
    cache-home="false" 
    lookup-home-on-startup="false"  
    home-interface="com.dosideas.business.ejb.MiServicioHome"  
    resource-ref="false" 
    refresh-home-on-connect-failure="true">
    <jee:environment>  
        <!-- Incluir información del entorno aquí -->  
    </jee:environment>  
</jee:remote-slsb>

[editar] Ver también

分享到:
评论

相关推荐

    EJB&Spring;详细对比

    ### EJB与Spring详细对比分析 #### 一、引言 在现代企业级应用开发领域,EJB(Enterprise JavaBeans)与Spring框架均扮演着重要角色。随着技术的发展与需求的变化,两者之间的对比成为了业界广泛关注的话题。本文...

    ejb spring

    **ejb与Spring框架整合详解** ejb(Enterprise JavaBeans)是Java EE平台中的核心组件,主要用于构建可扩展的企业级应用程序。它提供了服务器端的组件模型,包括会话bean(Session Beans)、实体bean(Entity Beans...

    spring与ejb的区别

    ### Spring与EJB3.0的关键区别及其优劣分析 #### 一、Spring框架概述 **1.1 引言** Spring作为一个广受欢迎的开源框架,最初被设计用于减轻企业级应用开发中的复杂性问题。它的一个显著特点在于模块化的分层架构...

    EJB3.0和Spring比较

    【EJB3.0与Spring比较】 EJB3.0和Spring是两种广泛使用的Java企业级应用程序开发框架,它们在很多方面有所不同,这些差异主要体现在以下几个关键点: 1. **厂商无关性(Vendor Independence)** - EJB3.0遵循开放...

    j2ee研究文集,ejb,spring

    【标题】:“深入理解J2EE技术:EJB与Spring框架解析” 【描述】:本文集专注于J2EE领域的核心组件——Enterprise JavaBeans (EJB) 和流行轻量级框架Spring,旨在帮助开发者掌握这两者的关键概念和技术,为你的学习...

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part3

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1.第3部分。三部分全下完再解压第一部分!

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1,第一部分,。将三部分一起下载完后再解压第一部分!

    精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第14章代码

    在本章中,我们将深入探讨如何在Java企业级开发中集成和使用JavaScript Faces(JSF)、Enterprise JavaBeans(EJB)、Hibernate以及Spring框架。这些技术是构建高效、可扩展的企业级应用的重要工具,它们各自拥有...

    精通JSF基于EJB HibernateSpring整合天发与项目实践 书本源码

    《精通JSF基于EJB Hibernate Spring整合天发与项目实践》是一本深入讲解Java服务器页面(JavaServer Faces,简称JSF)、企业级JavaBean(Enterprise JavaBeans,简称EJB)、Hibernate对象关系映射(Object-...

    EJB and Spring

    **EJB(Enterprise JavaBeans)和Spring框架是Java企业级应用开发中的两个核心组件,它们在不同的场景下各自发挥着重要作用。EJB是Java EE(Java Platform, Enterprise Edition)的一部分,提供了一种标准的方式来...

    精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第16章代码

    在本资源中,"精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第16章代码",我们探讨的是一个使用JavaServer Faces (JSF)、Enterprise JavaBeans (EJB)、Hibernate以及Spring框架进行企业级Web应用开发的实际...

    struts2 + ejb3 + spring 整合了

    在本文中,我们将探讨如何将三个流行的Java EE框架——Struts2、EJB3和Spring——集成在一起,形成一个强大的企业级应用。这个整合过程对于初学者来说可能会有些复杂,但通过逐步指导,我们将简化这一过程。我们使用...

    Hibernate+Spring+EJB+Ajax-关于这四种技术的详细讲解

    在IT行业中,Hibernate、Spring、EJB(Enterprise JavaBeans)和Ajax是四个非常重要的技术,它们各自在软件开发的不同方面发挥着关键作用。下面将分别详细介绍这些技术,并探讨它们之间的协同工作方式。 **...

    spring集成ejb

    Spring 集成 EJB(Enterprise JavaBeans)是将轻量级的 Spring 框架与企业级的 EJB 3.x 技术相结合的一种方式,以实现更灵活且高效的企业应用开发。Spring 提供了一个丰富的IoC(Inversion of Control,控制反转)和...

    Java Jsp EJB Spring学习

    【Java Jsp EJB Spring 学习】 Java Jsp EJB Spring 是企业级软件开发中的核心技术,它们在构建高效、可扩展的Web应用程序方面发挥着关键作用。让我们逐一深入探讨这些技术及其相互间的关联。 首先,JavaServer ...

    精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第15章代码

    在"精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第15章代码"中,我们可以推测这章内容可能涉及以下知识点: 1. **JSF与Spring的集成**:如何在JSF应用中利用Spring进行依赖注入,以及如何在JSF的managed ...

    weblogic8下ejb2.0与spring集成

    因本人现在工作中需要到ejb2.0,考虑到现在ejb2.0资料匮乏,故整理献上。具体步骤:把项目导出jar文件,在weblogic8中部署,运行Client.java即可。由于weblogic不支持jdk1.4以上版本,请使用jdk1.4编译

    ejb3+spring+struts实现简单银行系统

    【ejb3+spring+struts实现简单银行系统】 在Java开发领域,EJB(Enterprise JavaBeans)3、Spring框架和Struts框架是常见的企业级应用开发技术,它们结合使用可以构建高效、可扩展的Web应用程序,特别是对于复杂的...

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part2

    精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1.第二部分。三部分全下完再解压第一部分!

Global site tag (gtag.js) - Google Analytics