Study EJB2
EJB的类型:
可以按照以下的特性区分它们:
1. 实现的接口
2. 同步,还是异步。
3. 是否保持状态。
4. 远程,还是本地。
1.按照接口。
会话bean. 必须实现javax.ejb.SessionBean
实体bean. 数据持久化bean必须实现javax.ejb.EntityBean.
消息bean. 这种bean处理来自消息队列的消息,必须实现javax.ejb.MessageDrivenBean.
以上三个bean都继承自EnterpriseBean.
2. 同步bean,异步bean
实体bean和会话bean只能按同步方式调用。
消息bean,就是异步bean。只能被异步调用,它们没有本地接口而且不能被直接调用。它们被连接到一个消息队列中,当有消息要处理的时候被EJB容器调用。
3. 在EJB中保持状态
在EJB的对象池中有A、B、C三个Bean对象,请求D、E在第一次的时候容器分别分配给它们A、B对象,当D、E第二次请求的时候容器分配给它们的是C、B对象。请求F要求在容器重起以后仍旧可以调用上一次掉用的C对象,所以容器把C对象保存报数据库中,下一次请求F就可以再次调用相同的C bean了。
以上的A、C为无状态bean(stateless bean)。它们不能保存状态。
B为有状态bean(stateful bean)。容器可以保证在请求的bean是相同的一个,客户可以存储有状态bean的句柄,句柄可以被串行化,以后可以调用相同的bean。但是有状态bean在容器重起后就失效了,所以它是正在的会话bean。
C为持久化bean(entity bean)。实体bean可以将它的状态保存到持久化数据存储。
4. 远程EJB与本地EJB
本地EJB是在2.0版本引进的。存在于本JVM中,所以不需要存根和骨架。
本地EJB扩展的接口不同于远程的EJB:
javax.ejb.LocalEJBObject 而不是javax.ejb.EJBObject
javax.ejb.EJBLocalHome 而不是 javax.ejb.EJBHome
它不会throw java.rmi.RemoteException
修改bean的时候会影响其它bean的使用者。