EJB 五个步骤
组件接口里面声明所有业务方法
客户使用 home 接口来请求组件接口的一个引用
组件接口必须扩展 EJBObject
Bean 必须实现 sessionBean 接口,但 bean 不能实现组件接口
部署描述文件描述的是 bean 的结构,包括三个文件(组件接口、 home 接口和 bean 类)相互之间如何关联
部署描述文件的名字必须是“ ejb-jar.xml ”,而且必须放在一个名为“ META-INF ”的目录下
EJB体系结构
如果你是一个对象,而且你有另一个对象的引用,那个对象就必须和你在同一个堆中。
JAVA RMI (远程方法调用)为客户提供一个代理对象,即桩( sub ) , 这个代理对象相当于客户和远程对象之间的中间人,客户在桩上调用方法,桩则负责完成与远程对象的底层通信( socket 和流)
利用 RMI ,客户对象会表现得好像在做一个远程方法调用。但实际上,它只是在一个“代理”对象上调用方法,这个代理对象在客户所在的同一个堆中运行。这个代理称为“桩”,它会处理所有底层的网络 socket 和流。
服务器端有这么一个“东西“(骨架 skeleton ),桩知道怎么和它通信,另外它也知道怎么解释来自桩的消息,并在远程对象上调用一个方法
不需要自己建立桩和骨架。对于普通的 RMI ,使用 RMI 编译器就可以生成桩和骨架。
远程对象和桩都实现相同的接口(远程接口),这个接口包括了客户想调用的方法。远程接口必须扩展 java.rmi.Remote 。而且每个方法都必须声明一个 RemoteException
在 EJB 中,远程对象不是 bean ,它是 bean 的保镖 —EJBObject
远程对象和桩都实现了同一个接口,即业务接口(也称为组件接口),不过没有实际的业务逻辑行为
Bean 类没有实现业务接口,不过 bean 才有真正的业务逻辑功能
RMI 接口和远程组件接口之间的主要区别在于,在 EJB 中,远程组件接口扩展的是 javax.ejb.EJBObject 而不是 java.rmi.Remote 。 EJBObject 接口扩展了 Remote ,所以 EJBObject 是一个远程接口。通过组件接口将业务方法展现给客户。
谁来创建 EJBObject 类?
由容器来建,你来声明方法,由容器实现你的组件接口。
我们创建:组件接口, bean 类, home 接口
容器创建: EJBObject 类, EJBObject 桩类, Home 类, Home 桩类
EJBObject 类提 bean 类完成安全、事务等事项,而桩就像上面说的来负责完成与远程对象的底层通信
每个会话 bean 和实体 bean 都有一个 Home ,消息驱动 bean 没有 home 。 Home 的任务就是分发该 bean 组件接口的引用。
客户远程方法调用流程(假设AdviceBean是个sessionBean):
1. AdviceBean 得到部署,服务器实例化一个 AdviceBean Home 对象,并向 JNDI 注册该 Home 对象
2. 客户对 Home 完成一个 JNDI 查找,这里使用前面注册的名字“ Advisor “
3. JNDI 发回远程 Home 对象的一个桩
4. 客户通过调用 create ()向 Home 请求组件接口的一个引用。(客户想“创建“一个 bean ,并得到该 bean EJBObject 的一个桩)
5. 现在“服务“介入, bean 得到创建
6. 建立 EJBObject ,它的桩返回给客户
7. 客户在 bean 上调用一个业务方法
8. 客户不想访问该类的更多 bean 时,可以删除他的 home 桩,不过即使删除了 Home 桩,仍然可以继续调用组件接口上的方法。