EJB中包括什么?
- 业务接口
- 业务逻辑
- 厂类信息
- Bean元数据
1、业务接口
EJB的主要用途是实现业务或应用逻辑。因此,bean开发者要定义或派生bean需要的业务操作,并在RMI远程接口中对这些操作进行正式化。这与稍后所学的本地接口相对,称为bean的业务或者远程接口。
远程接口中方法的定义取决于bean的具体用途,但关于接口有一些通用规则:
- 使用任何基于RMI的接口时,当每个方法抛出java.rmi.RemoteException以及任何面向业务的异常时,必须对此方法进行声明。这样允许RMI字系统向客户端发出与网络相关的错误信号。
- RMI规则也应用于参数和返回值,因此使用的类型必须是原始类型,Sereializable类型或Remote类型。
- 接口必须声明扩展了javax.ejb.EJBObject接口。
关于对象的参数和返回值的问题也是很值得研究一番的。当你向本地方法调用中传递参数时,将提供一个初始对象引用以供方法中使用。由于用户共享同一个对象,因此所有用户都能看见对象状态的变化。同时也无需创建对象副本——只需传递一个引用即可。
另一方面,当使用RMI远程方法时,连续对象(实现Serializable接口)通过值进行传递,然而远程对象(例如EJB)通过引用进行传递。通过值进行传递意味着发送了一个对象副本。这又如下几层含义:
- 首先连续对象的用户不再共享同一个对象;
- 其次通过bean的远程接口调用方法时可能会降低性能。不仅在网络调用时会降低性能,在拷贝对象以便于在网络中发送时也会降低性能。大多数情况下传递的都是连续对象。
2、业务逻辑
定义接口后面的业务逻辑的任务。EJB的业务逻辑存在于bean类中。这个bean包括两部分:
- 业务逻辑本身,包括远程接口定义的方法的实现;
- 一套允许容器管理bean生命周期的方法。
注意:尽管bean本身必须包括以上元素,注意non-trivialbean可以将其部分或全部业务功能委派给其他bean帮助程序或类来完成。
(1)业务接口的实现
首先要指明的是bean本身并不实现前文定义的远程接口。通过EJB配置信息中的属性可以请求容器代表EJB应用注入访问控制之类的服务。要达到此目的,容器必须有从客户端截取方法调用的途径。容器接收到方法后,判断是否需要其他额外服务,然后将此方法传递至bean本身。(例如:容器查看为EJB配置的安全信息,然后判断是否将其传递至bean)
名为EJBObject的服务器端对象截取方法调用。EJBObject作为bean的服务器段代理,实际上有EJBObject实现EJB的远程端口。
客户端调用EJBObject实现的业务方法。EJBObject应用需要的额外服务,然后将方法调用传递至bean本身。EJBObject与提供远程程序调用能力的RMI桩和骨架进行分离。
因此,你的bean必须能够实现远程接口中定义的业务方法。容器使用接口中定义的方法签名以及java映像API来查找bean上合适的方法,因此必须确认使用了正确的方法签名。
(2)提供生命周期的钩子
- Bean的创建和初始化
- Bean的销毁和删除
- Bean内部状态的保存和恢复(如果可应用)
- EJB根据自身类型来实现一个或多个生命周期接口。在javax.ejb包中定义这些接口。
- 生命周期方法通常使用ejb开头,这样方便我们区别于业务方法,例如ejbCreate()。
3、厂类信息
对一个客户端使用EJB而言,客户端必须要创建一个新的实例或发现一个现有的实例。EJB可以动态地创建和重新使用bean,这为EJB模型提供了可升级性。
为方便EJB的创建和发现,每种类型的EJB都提供了一个本地接口。Bean开发人员提供一个EJB本地接口作为这个EJB工厂。本地接口扩展javax.ejb.EJBHome接口,并包括bean开发人员识别的一些必要的方法,这些方法允许客户端创建、查找和删除EJB。
依据EJB的类型和EJB的使用方式,客户端获取EJB的方式有两种:
- create()
- findXXX()
本地接口是否允许你删除bean取决于bean的类型和bean的使用方法。
4、Bean元数据
EJB包含的最后一部分讲述的是为EJB提供配置信息或元数据(META_INF)。配置信息为EJB的需求和结构提供了一种与容器通信的方式。如果成功部署了EJB,必须要为容器提供一些额外的信息,包括:
- 用于查找EJB的EJB标识符或名字。
- Bean类型(会话类型,实体类型或消息驱动类型)
- EJB的远程接口是哪个类一般根据EJB的功能命名,如:Agency。
- EJB的本地接口是哪个类。本地接口名字一般由其远程接口名字派生而来。如:AgencyHome。这仅仅是一种命名习惯,而非强制的,因此元数据会明确显示本地接口的名字。
- Bean本身是哪个类。如:AgencyBean。这也是非强制性的命名方式,所以元数据会明确显示本地接口的名字。
- 任何作为bean的命/值对。
- EJB需要的外部资源信息,例如数据库连接或其他EJB。
- 安全和事务的声明属性。
- 结构信息bean的关系和依赖性。
- 持久性映射(如果时可应用的)。