(本文承接上一篇文章《会话EJB系列(一)EJB概述》,继续对EJB内容展开详细解说)
EJB规范中定义了三种Bean:
会话Bean(Session Bean)
实体Bean(Entity Bean)
消息驱动Bean(MessageDrive Bean)
一.SessionBean的概念和作用
(1)定义
作用:用于处理业务逻辑的完整组件。
当SessionBea部署在在EJB容器中后,客户端获取该EJB组件,并调用它的方法,至方法结束,称为:客户端与SessionBean之间的一次会话,简称为会话Bean。
(2)EJB容器中SessionBean与Spring容器中POJOBean对比
可以把运行在EJB容器中的Session Bean,看做是运行在Spring容器中的POJOBean,只是SessionBean更强大一些而已,如:
1)并发与线程安全
EJB容器提供多线程并发功能,用于处理数量众多的客户端,但开发者完全不需要理会多客户端并发的线程安全问题,就像开发普通Java类一样。
2)方便Web Service支持
支持基于SOAP(Simple Object Access Protocol,简单对象访问协议)的WebService的访问,只需要少量配置
3)事务和安全管理
EJB以生命方式管理运行在其中的SessionBean的事务和安全
类似于Spring容器通过AOP以生命方式管理运行在其中的POJO Bean事务
(3)SessionBean分类
当客户端调用会话Bean的业务方法时,实例变量会一直记录着客户端的状态,称作“会话状态”。
1)Stateful Session Bean
有状态的会话Bean为特定客户端程序保持,用1-多个实例变量来记录会话状态,其状态在会话过程中保持,会话结束则不再保存。
2)Stateless Session Bean
无状态的会话Bean不为特定的客户端程序保持状态,不需要实例变量来记录会话状态,其状态仅限于方法调用的时候存在,当方法结束后不再保存
对比可知,有状态的会话Bean往往需要额外的系统开销来维护会话状态,所以性能要低一些。只有无状态的会话Bean可对外提供WebService,其他EJB不具有这种功能。
二.Message Driven Bean的概念和作用
(1)消息驱动Bean与事件监听器的对比
消息驱动Bean就是一个JMS消息的异步消费者,相当于一个事件机制中的事件监听器。
区别:事件监听器监听的是事件源上的事件;消息驱动Bean监听的是JMS的到来
(2)消息驱动Bean与无状态SessionBean对比
消息驱动Bean本身由无状态SessionBean变种而来
1)相同点
不会保留任何客户端状态,对所有客户端都是同等的
可以处理来自多个客户端的消息
2)不同点
客户端不能直接调用消息驱动Bean,只能通过发送JMS消息到消息目的地来触发消息驱动Bean。
消息驱动Bean本身由无状态SessionBean最大的优势在于“完全解耦”,无需获取消息驱动bean,甚至不需要知道消息驱动Bean的存在与否,只需要向目的地发送JMS消息就可以实现与消息驱动Bean的通信,相当于间接调用消息驱动Bean的onMessage方法。
三.实体和JPA
(1)EJB中的实体Bean与Hibernate中PO对比
EJB3中的实体Bean,是一个轻量级的持久化对象,就像Hibernate中的PO一样
1)相同点
实体Bean本身不具有持久化能力,需要JPA(java Persistence API)来操作这些实体,方可完成数据库的持久化访问。
2)不同点
改用Annotation来管理实体和数据库表之间的映射关系,而不是XML映射文件
(2)DAO与EAO
1)轻量级Java EE
以Spring+Hibernate为核心, 需要在Spring容器中建立DAO(Data Access Object)层用于实现数据库的访问逻辑,(建立在PO+Hibernate持久化API基础之上)
2)经典Java EE
以EJB为核心,需要在EJB容器中建立EAO(Entity Access Object)用于实现对底层数据库的访问,(建立在Entity+JPA基础之上),本质是类似的
(四)总结,EJB三种Bean
会话Bean,分为两种:有状态、无状态。较Spring的POJOBean有如下优势:并发与线程安全、只是WebService、事务和安全管理
消息驱动Bean,是JMS消息的异步消费者,由无状态Session变种而来。
实体Bean,类似Hibernate中的PO,并改用Annotation来管理实体和数据库表之间的映射关系。