3.3 EJB合约

  这里的合约是指不同EJB角色合作的约定,也是不同角色的开发者开发的产品要遵守的约定。对于EJB提供者即开发者来说,要遵守客户端视图合约;对于EJB容器的开发者和使用者来说,要遵守组件和约。本节对这两个合约进行讨论。
  在EJB开发过程中,这些合约的体现是EJB开发接口和一些EJB内部对象。
  1. 客户端视图合约
  是客户端与容器之间的合约。客户端视图合约为使用企业Beans作为组件开发应用程序提供一个统一的开发模式。这个统一的模型使使用高级的开发工具成为可能,并实现组件重用。企业Bean客户端视图是基于远程访问的,它允许本地和远程对象采用统一的方式进行访问。
  一个企业Bean的客户端可能是部署在同一个或不同容器的另一个企业Bean。也可以是任何一个Java程序,如应用程序、Applet或Servlet。一个企业Bean的客户端视图也可以被映射到非Java客户端,如CORBA客户端。它不是由JavaTM编程语言写的。企业Bean提供者和容器提供者一同提供企业Bean的客户端视图。客户端视图包括:
  ·主程接口(Home Interface)
  ·远程接口(Remote Interface)
  ·对象识别(Object Identity)
  ·元数据接口(Metadata Interface)
  ·句柄(Handle)
  主接口(Home Interface):定义创建、删除和查找同类 EJB对象的方法(即它们由同一个企业Bean实现)和主业务逻辑方法(即不是特定某个Bean实例的方法)。主接口由Bean提供者制订;容器创建一个类来实现主接口。主接口继承javax.ejb.EJBHome接口。
  客户端通过标准的Java名称和目录接口(Java Naming and Directory Interface TM,JNDI)API定义企业Bean主接口。
  EJB对象是通过远程接口(Remote Interface)来访问的。远程接口定义了客户端调用的业务逻辑方法。远程接口由Bean提供者制定;容器创建一个类来实现远程接口。远程接口继承了javax.ejb.EJBObject接口。javax.ejb.EJBObject接口定义了允许客户端访EJB对象标识和EJB对象创建一个持久性句柄的操作。
  每个EJB对象在主域里存活,并有一个惟一的标识。对 Session Beans来说,容器负责为每个Session对象产生新的惟一标识。这个标识并没有暴露给客户端。然而,客户端可以测试两个对象引用是否指向同一个Session对象。对实体EJB来说,Bean提供者负责在Entity对象创建的时候提供一个主键;容器使用主键来在主域中标识实体对象。客户点可以通过javax.ejb.EJBObject接口获取一个实体对象的主键。客户端也可以测试两个对象引用是否指向同一个实体对象。
  客户端也可以获取企业Bean的元数据接口。客户端使用元数据接口主要用在执行企业Bean的动态调用上。(提供客户端视图的类不可用的时候需要动态调用)。
  消息驱动Beans没有Home和Remote接口,因此它没有客户端视图。客户端可以通过标准JNDI API定位发到消息驱动Bean的消息所在的JMS目标。
  2. 组件合约
  这部分描述企业Bean和它的容器之间的合约,以及在容器管理持久性的企业Bean情况下,企业Bean和它的持久管理器之间的合约。主要的合约如下(部分):
  ·需要Bean提供者实现企业Bean类中的业务方法。需要容器提供者提供客户端调用这些方法的代理。
  ·对于消息驱动Beans来说,需要Bean提供者实现企业Bean类中的onMessage方法。需要容器提供者调用这些方法。
  ·如果Bean是实体并且是Bean管理持久性(BMP)的,需要Bean提供者实现ejbCreate方法ejbPostCreate方法、ejbRemove方法和ejbFind方法。需要容器提供者在EJB对象的创建、删除和查询的过程中调用这些方法。
  ·对于容器管理的持久性,需要Bean提供者为持久属性提供抽象的访问方法和一个实体与容器管理持久性的关系。需要持久管理提供者提供这些方法的实现。
  ·需要Bean提供者提供持久性管理器实现的关系描述。
  ·需要Bean提供者定义企业Bean的主接口和远程接口,如果是实体Bean或Session Bean,需要Container提供者提供实现这些接口的类。
  ·对会话来说,需要Bean提供实现javax.ejb.SessionBean接口或在javax.ejb.SessionSynchronization接口中定义的容器回调。需要容器管理者在适当的时候调用这些回调。
  ·对消息驱动Beans来说,需要Bean提供者实现定义在接口javax.ejb.MessageDrivenBean中的容器回调。
  ·对实体EJB来说,需要Bean提供者实现定义在javax.ejb.EntityBean中的容器回调。需要容器在适当的时候调用这些回调。
  ·需要持久管理器提供者实现实体Beans的持久性。
  ·需要容器提供者为会话bean实例提供javax.ejb.SessionContext接口,为实体bean实例提供javax.ejb.EntityContext接口,为消息驱动bean实例提供javax.ejb.MessageDrivenContext接口。上下文接口允许实例获取容器的信息。
  ·需要容器为Bean实例提供JNDI上下文,它包含企业Bean的环境信息。
  ·需要容器为企业Bean实例管理事务、安全和异常。
  ·需要Bean提供者避免程序影响企业Bean实例的容器运行时管理。
  3. ejb-jar文件
  一个ejb-jar文件具有标准的格式。EJB工具用它来作为描述性的语言打包企业Beans。ejb-jar文件用来执行程序的装配和部署。
  ejb-jar文件包括:
  ·企业Beans的Java类文件和它们的远程和主接口。
  ·XML部署描述符。部署描述符提供关于在ejb-jar文件中的企业Beans的结构和装配信息。
  4. 合约总结
  如图3-2描述了EJB的合约。
  
  注意 图3-2只显示远程客户端运行在Container外的情况,客户端视图API也可以用在同一个容器中的企业Beans。