- 浏览: 3471898 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
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
- MockEjb
- JndiTemplate
- Manual de Referencia de Spring, Capítulo 18: integración de EJB
- Pro Spring: Spring and EJB
发表评论
-
说明SOA监管(SOA Governance)实例(收录备查)
2012-12-19 11:35 1713SOA 已经不是单纯技术问 ... -
Injecting Spring Beans into Java Servlets
2012-11-01 10:21 1907If you are working in a Java ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3705原文出处:http://blog.chenlb.com/200 ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:17 3836When I try to install the And ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:13 1939When I try to install the And ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14788大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1670charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22523Java Native Access 项目 在 ... -
使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
2011-04-20 11:59 13284"在服务器运行过程中,Spring不停的运行的计划任 ... -
DBCP代码研读以及就数据库连接失效的解决
2011-03-31 11:03 3728问题 网上很多评论说DBCP有很多BUG,但是都没有指明是什 ... -
ContextLoaderListener
2010-12-06 15:58 8423(1) org.springframework.web.c ... -
Servlet3.0新功能: 异步处理
2010-12-06 15:22 3123J2EE 6和Glassfish 3V正式发 ... -
Servlet3.0引入的新特性
2010-12-06 15:20 3027Servlet3.0规范的新特性主要是为了3个目的: ... -
100個節點上運行群集亞馬遜EC2上Hazelcast
2010-12-03 23:59 3293本文的目的,適是给妳湮示的細節集群的100個節點。此湮示記錄, ... -
Spring Properties Reloaded
2010-12-02 14:54 4343Spring Properties Reloaded Som ... -
为spring2.5中的jpetstore增加perf4j监控
2010-09-02 13:51 2609perf4j是一款类似于log4j的性能检测工具. 它 ... -
语义网的学习资源大汇集(备忘)
2010-06-23 22:48 1688网上资源 http:/ ... -
使用 JOLAP 实现复杂分析查询
2010-06-06 13:42 1923Shashank Tiwari 在本文中对 ... -
HTML5 Canvas for Internet Explorer
2010-06-04 21:16 1828Canvascape http://www.benjoff ... -
大型网站架构演变和知识体系
2010-06-01 23:47 1911架构演变第一步:物 ...
相关推荐
很详细的EJB&Spring;对比。。。不了解的可以下载看看。本来就是靠它搞懂的。才拿来分享。
这个demo,实现了ejb+spring的集合。ejb主要是消息驱动bean和会话bean。
精通JSF基于EJB Hibernate Spring整合开发与项目
spring与ejb.pdf 详细讲述spring 与ejb
EJB3.0和Spring比较
精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1.第3部分。三部分全下完再解压第一部分!
精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1,第一部分,。将三部分一起下载完后再解压第一部分!
《精通JSF基于EJB HibernateSpring整合天发与项目实践》人民邮电出版社, 作者:徐明华/邱加永/郑经煜
精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第14章代码
精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第16章代码
EJB and Spring
精通JSF-基于EJB Hibernate Spring整合开发与项目实践-第15章代码
因本人现在工作中需要到ejb2.0,考虑到现在ejb2.0资料匮乏,故整理献上。具体步骤:把项目导出jar文件,在weblogic8中部署,运行Client.java即可。由于weblogic不支持jdk1.4以上版本,请使用jdk1.4编译
EJB3,Spring,Struts2整合
JPA学习笔记-EJB-06JPA+Spring使用经验。
精通JSF-基于EJB Hibernage Spring整合开发与项目实践代码.part1.第二部分。三部分全下完再解压第一部分!
Hibernate+Spring+EJB+Ajax-关于这四种技术的详细讲解。全面、易懂。
我是一个EJB3.0的新手 ,经过几天的搜索资料和自己的许多次测试,终于实现了ejb3、spring、struts2的整合,在这里写明一下简单的实现过程,希望对新入门的网友有所帮助,也请高手们不要拍砖,多多提出您的意见,在此...
spring集成ejb
Java Jsp EJB Spring学习