EJB

来自站长百科
跳转至: 导航、​ 搜索

EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。EJB是一个封装有某个应用程序之业务逻辑服务器端组件。EJB最早于1997年IBM提出,旋即被太阳微系统采用并形成标准(EJB 1.0 和EJB 1.1)。其后在Java社区进程(Java Community Process)支持下陆续有一些JSR被制订来定义新的EJB标准,分别是JSR 19 (EJB 2.0), JSR 153 (EJB 2.1) 以及最新的JSR 220 (EJB 3.0)。

EJB规范的目的在于为企业及应用开发人员实现后台业务提供一个标准方式,从而解决一些此前总是在作业过程中总是重复发生的问题。EJB以一个标准方式自动处理了诸如数据持久化,事务集成,安全对策等不同应用的共有问题,使得软件开发人员可以专注于程序的特定需求而不再饱受那些非业务元素的困扰。

EJB新特性一览

EJB的特点[ ]

  1. 由一个 EJB 容器在运行时创建和管理 EJB
  2. 在部署 EJB 时定制其运行方式
  3. 由 EJB 容器和服务器来协调客户端的访问
  4. 可以部署到任何兼容的 EJB 容器中
  5. 客户端对 EJB 的视图是由 Bean 开发人员决定的

EJB 容器[ ]

  1. 管理 Bean 生命周期:将 EJB 服务器提供的服务传递给 Bean
  2. 生成代码来实现对 Bean 的存取访问
  3. 强制事务处理的限制
  4. 创建、初始化和回收 Bean
  5. 管理持久数据的存储
  6. 对客户端而言 EJB 容器是透明的

EJB 容器提供的服务[ ]

数据存储

  • 容器决定何时载入/储存状态
  • Container-Managed Persistence(容器管理存储/CMP)
  • 容器负责存储您的 Bean
  • 容器生成必要的类和代码
  • Bean-Managed Persistence(Bean 管理存储/BMP)
  • Bean 开发人员提供存储代码
  • 开发人员决定 如何存储, 容器仍然决定 何时进行

事务处理

  • 可以由容器代理来实现
  • 容器将得到业务逻辑方法的事务处理需求
  • 容器提供事务控制代码
  • 也可以由程序员通过代码实现

其它服务

其它服务包括:

  • 命名 (Naming)
  • 安全 (Security)
  • 线程管理 (Thread management)
  • 这些服务由容器代理完成将减少应用开发人员的负担

EJB的种类[ ]

EJB容器可以接受三类EJB

1、无状态会话Bean(Stateless Session Beans)

无状态会话Bean是一类不包含状态信息的分布式对象,允许来自数个客户端的并发访问。实例变量的内容在前后数次呼出中不被保留(确切地说是不保证保留)。由于不必控制与用户间的对话信息而减少了开销,无状态会话Bean不像有状态会话Bean那样具有资源集约性。举例来说,一个发送邮件的EJB就可被设计为一个无状态会话Bean。在整个会话期,用户只向服务器提交一个动作:发送指定邮件到指定地址。(称为开关行为)

2、有状态会话Bean(Stateful Session Beans)

有状态会话Bean是包含状态的分布式对象,即是说,贯穿整个会话它们都要保有客户端信息。举例而言,在一个网上商店进行实施结账很可能就需要一个有状态会话Bean,因为结账是一个多步动作,服务器端必须可以随时了解到用户已经进行到了哪一步。此外,尽管有状态会话Bean的状态信息可被保持,但始终只能同是由一个用户来访问之。

  • 实体Bean(Entity Beans)

实体Bean是含有持久化状态的分布式对象。这个持久化状态的管理既可以交给Bean自身(Bean-Managed Persistence,BMP),也可以托付于外部机制(Container-Managed Persistence,CMP)。

  • 消息驱动Bean(Message Driven Beans ,MDBs)

消息驱动Bean是支持异步行为的分布式对象。它们并不对请求进行当即响应。比方说,某网站用户点击“请通知我更新信息”按钮,将会触发某个MDB将这名用户加入到数据库的希望获得更新信息用户列表中。这个动作就是一个异步的消息驱动过程,因为用户不必等待当时会返回某个结果。MDB的消息源来自Java消息服务(JMS)提供的消息队列或消息主题。自EJB 2.0规范起,JMS被加入进来以允许在容器内部实施事件驱动处理。与其他EJB不同,MDB不存在一个用户视图(如需要用户引用的远程接口),用户也不能通过资源定位获得一个MDB实例。MDB只在后台监听消息源并实施自动处理。

除了上述以外,目前还有一些EJB处于设想阶段,如JSR 86提出了用于在JavaEE应用中集成多媒体对象的媒体Bean(Enterprise Media Beans)。

EJB的体系结构[ ]

  • 目前,EJB最新的标准是2.1,EJB3.0规范正在讨论中,预计将于明年推出。EJB2.1定义了三种企业Bean,分别是会话Bean(Session Bean),实体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。
  • Session Bean用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个Session Bean来为客户端服务。Session Bean可以直接访问数据库,但更多时候,它会通过Entity Bean实现数据访问。
  • Entity Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
  • MessageDriven Bean是EJB2.0中引入的新的企业Bean,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。MDB实际上是一个异步的无状态Session Bean,客户端调用MDB后无需等待,立刻返回,MDB将异步处理客户请求。这适合于需要异步处理请求的场合,比如订单处理,这样就能避免客户端长时间的等待一个方法调用直到返回结果。
  • 调用一个EJB组件要比调用一个JavaBean麻烦些,由于EJB组件可以分布在多口,然后使用Home接口创建EJB之后就可以调用EJB的方法了。

EJB的理论实行[ ]

EJB部署于应用服务器端的EJB容器中。规范给定了EJB与EJB容器之间,以及用户代码与EJB/EJB容器之间的交互方式。对于Java EE APIjavax.ejb包定义了EJB类,javax.ejb.spi包定义了EJB容器应当实现的各个接口。

在EJB 2.1和以前的版本中,每个EJB都由一个类和两个接口组成。EJB容器负责创建这个类的实例,接口则供客户端调用。

两个接口分别被称为Home接口和组件接口,负责提供各个EJB远程方法声明。这些EJB远程方法可分成两组:

  • 类方法:由Home接口提供。与特定实例无关,仅负责一些公共内容,比如创建一个新的EJB实例(create方法),或寻找一个已经存在的EJB实例(find方法)等等。
  • 接口方法:由组件接口提供的针对特定实例的业务方法。

EJB容器将为这些接口提供对应的实现类以充当客户远程代理,当客户端调用这个生成的代理类的某个方法时,代理类内部会将此调用的方法和参数封装成一个消息发送给服务器。服务器受到消息后在转发给真实的EJB实例,后者负责执行真正的业务逻辑。

远程通信

EJB规范要求EJB容器能够支持基于RMI-IIOP的EJB访问。EJB既可被任何CORBA应用访问,也能提供Web服务。

事务

EJB容器必须支持符合ACID(原子性/一致性/独立性/持久性)特性的容器级事务管理,以及bean内部事务管理。容器级事务需在部署描述符中(EJB应用的配置文件)进行声明。

事件

EJB使用JMS向客户对象发送消息,客户则可以异步地接受这些消息。MDB则接受来自客户端的消息。

命名和目录服务

EJB客户端使用JNDICORBA名字服务定位Home接口实现 对象。通过此Home接口,用户还可以寻找,创建或删除实体对象。

安全

EJB容器对客户端的访问权限负责。

部署EJB

EJB规范还定义了一个跨平台的统一部署机制。部署描述符中定义了关于EJB应用的一切相关内容。文件名通常为ejb-jar.xml。

部署描述符是一个XML文档,负责为该EJB应用中的每一个EJB定义入口。部署描述符的主要内容包括:

  1. Home接口名
  2. Bean的Java类名
  3. Home接口的Java接口名
  4. 组件接口的Java接口名
  5. 持久化存储(针对实体Bean)
  6. 安全策略和角色分配

通常EJB容器提供者还定义了一些额外的XML或其他格式描述文件来强化其容器的功能。他们还同时提供这些描述文件的解读工具类和对Home接口的自动实现类生成。

EJB3.0起开始广泛使用Java注释替代传统的部署描述符ejb-jar.xml。但后者仍然有效。


EJB版本历史[ ]

EJB 3.0

2006年5月2日发布,JSR 220定义。

  • 全面采用Java注释代替部署描述符。(后者仍可使用,并且具有更高优先级)
  • 把2.X版的EntityBean改为由JPA支持。

EJB 2.1

2003年11月24日发布,JSR 153定义。

  • Web服务:可将无状态会话bean暴露为Web服务;EJB可通过引用访问Web服务。
  • EJB定时器服务:提供一种新的基于定时器的事件驱动方式。可供消息驱动bean作为消息源使用。
  • 增加了消息目的地。
  • 进一步丰富了EJB查询语言,支持ORDER BY, AVG, MIN, MAX, SUM, COUNT和MOD。
  • 使用XML schema代替DTD以定义部署描述符。

EJB 2.0

2001年8月22日发布,JSR 19 定义。

  • 制定了构建面向对象商务应用的标准组建结构。
  • 支持构筑使用不同开发工具所开发之组件的联合应用部署。
  • 在多线程,连接池,事务管理等方面对用户透明化。
  • 使符合“一次写成,多次运行”的Java思想。
  • 关注企业级应用生命期间的开发,部署,运行等动作。
  • 定义了不同开发工具所需遵守的契约,以便其产品能够在运行期交互。
  • 支持与现行系统兼容,开发者可以扩展现有产品以使之支持EJB。
  • 与其他Java API兼容。
  • 支持EJB与Java2平台企业版或者其他非Java应用程序之间的互操作性。
  • 支持与CORBA兼容的RMI-IIOP。

EJB 1.1

1999年12月17日发布。

  • 开始采用XML部署描述符,默认的JNDI上下文以及可支持IIOP的RMI。
  • 安全机制由角色(Role)驱动,而非方法。
  • 支持实体类,且必须在应用中实现。

EJB 1.0

1998年3月24日发布。

  • 定义了EJB和EJB容器的作用,实现与互动。
  • 提供了最早的开发者与用户视图。

相关条目[ ]

参考来源[ ]