Enterprise JavaBeans(EJB)是一个用于分布式业务应用的标准服务器端组件模型。采用EJB架构编写的应用是可伸的、事务性的、多用户安全的。可以一次编写这些应用,然后部署在任何支持EJB规范的服务器平台,如JBoss,WebLogic等。
由于 EJB 2.0 程序要求您扩展特定的类、提供多个接口并编写部署描述符,因此它们被视为“重载”的 Java 对象,而不再是简单的对象,而且还需要J2EE容器来运行和测试它们。由于EJB 2.0的复杂性,在Spring和Hibernate等轻量级框架出现后,大量的用户转向了轻量级J2EE开发框架,为了降低EJB开发的复杂性,改善EJB的结构,EJB 3.0规范应运而生,EJB技术也因此受到更多开发者的青睐。对于 Java EE 5 中的所有技术增强而言,Enterprise JavaBean (EJB) 3.0 是最为显著的,已对它的外观进行了很大的更改[1]。
EJB 3.0 的简化包括:
(1)EJB 组件不再要求主接口。另外,不再需要 EJB 组件提供不同的接口或扩展任何特定于 EJB 的类。
(2)J2SE 5.0 标注现在是实现 EJB 3.0 组件的一个主要辅助方法。通过指定特殊的标注,开发人员可以创建 EJB 组件的 POJO 类,并将其作为 XML 的备选方案。
(3)EJB 3.0 引入了业务接口概念,而非单独的远程和本地接口。
图1从客户视图描述了业务方法调用,EJB 3.0消除了原有的Home与对象接口从而使EJB组件的开发更简单。EJB 3.0会话Bean将所有业务方法都放在业务接口中,依据客户类型的不同来提供远程业务接口或本地接口,或者同时提供两种类型的接口。
图1 EJB内部运转过程
步骤1是指EJB应用的客户端使用远程或者本地业务接口调用EJB构件的业务方法。客户端从JNDI命名和注册器服务中获取业务接口引用。
在调用业务方法期间,需要使用到EJB容器服务。用于包裹远程或者本地业务接口的、由容器生成的实现类会负责调用EJB容器服务。在调用EJB Bean类中的业务方法前,容器生成的包裹类会调用容器专有API来获得中间件服务。同样,在调用EJB类中的业务方法后,容器生成的包裹类也会调用容器专有API来获取中间件服务。整个过程发生在步骤2、3、4、5中,最后调用过程结束,返回。
EJB规范中定义了三种类型的企业Bean,分别是会话Bean、实体Bean和消息驱动Bean。它们分别代表了三种不同类型的事务逻辑的抽象。
(1)会话Bean(Session Bean)
Session Bean实现了运行于服务器上的业务逻辑。一个会话Bean对象可以看成运行在服务器上的客户端程序的扩展。Session Bean的一个显著特征是它依附于客户端,产生和销毁由客户端控制,只会服务一个client端的请求,但Session Bean的状态不会被永久保存,即不具备持久性。另外,Session Bean不表示数据库中的共享数据,虽然它可以访问和更新这些数据。
Session Bean有两种应用方式无状态Session Bean和有状态Session Bean。
无状态Session Bean,无状态Session Bean的实现类可以由多个客户端共享使用,不保存客户端状态。
有状态Session Bean,和无状态Session Bean不同,每个客户端使用不同的Bean实现类,Bean实现类可以保存每个客户端的状态。
(2)实体Bean(Entity Bean)
实体Bean是含有持久化状态的分布式对象。Entity Bean用在处理客户端请求大量、并发的情况,可能会同时被多个client端进行存取,它在实现业务逻辑的同时,作为数据库的一个缓冲。在服务量大的情况下,减轻数据库的负担,提高业务处理能力。
这个持久化状态的管理既可以交给Bean自身(Bean-Managed Persistence,BMP),也可以托付于外部机制(Container-Managed Persistence,CMP)。
(3)消息驱动Bean
消息驱动Bean是支持异步行为的分布式对象。它们并不对请求进行当即响应。比方说,某网站用户点击“请通知我更新信息”按钮,将会触发某个MDB将这名用户加入到数据库的希望获得更新信息用户列表中。这个动作就是一个异步的消息驱动过程,因为用户不必等待当时会返回某个结果。MDB的消息源来自Java消息服务(JMS)提供的消息队列或消息主题。自EJB 2.0规范起,JMS被加入进来以允许在容器内部实施事件驱动处理。与其他EJB不同,MDB不存在一个用户视图(如需要用户引用的远程接口),用户也不能通过资源定位获得一个MDB实例。MDB只在后台监听消息源并实施自动处理。
消息驱动Bean(MDB)的基本思想是采用非标准服务通信,即采用消息驱动而不是方法调用。MDB的代码编写简单,主要工作是部署描述文件。MDB起到的功能是处理消息队列,并告诉EJB服务器哪个消息队列分配给某个Bean,以达到通过消息进行通信的目的。
EJB3.0较之前的旧版本在易用性上有了很大的提升,尽管在国内Spring的应用似乎更广泛一点,但是EJB3.0必将大有作为。
参考文献:
[1] Kehe, Wu., Zhuo W, Design and Implementation of the Monitoring System for EJB Applications Based on Interceptors[C]. IEEE, 2010