会话EJB系列(二)EJB分类

 (本文承接上一篇文章《会话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来管理实体和数据库表之间的映射关系。

 

 

你可能感兴趣的:(EJB)