1. Session Beans与Entity bean的关系:
Entity bean提供了一种对象模型,它可以有效的简化开发人员创建修改删除数据库数据所需的工作。Session bean则跨越多个业务概念对数据进行访问。Session bean包含业务逻辑而entity bean则模塑持久数据。
它们俩的关系就像是剧本和演员的关系。脱离剧本的演员是毫无意义的,他们也许可以表达什么,但却不能讲一个完整的故事;同样,如果没有实现彼此的交互,代表数据的entity bean也就没有意义了。
2. Session Beans的分类
Session Beans分为stateless和stateful两种类型。
Stateless session bean是一组相关服务的集合。每个服务由一个方法表示。它不维护任何介于两次方法调用间的状态。当你调用它的某个方法时,它会执行该方法并返回结果,既不了解也不关心前后还有哪些请求应用。
Stateless session bean是轻量而快速的:由于它不保存任何会话状态,因此也就不需要钝化或激活,进一步较低了切换的开销。
对于任何一项可以在一次方法调用中完成的活动而言,高效的Stateless session bean都是不错的选择。
Stateless session bean的生命周期:
Does Not Exist |
Method-Read Pool
@PreDesroy
Class.newInstance()
注入@PostConstruct
有两个状态:Does Not Exist和Method-Ready Pool
Does Not Exist:还未被实例化,即还没有存在于系统内存中;
Method-Ready Pool状态:当容器需要某个实例时,就进入了Method-Ready Pool状态;从Does Not Exist到Method-Ready Pool状态会执行三步:容器调用bean的Class.newInstance()
方法构造实例;容器通过注解或XML部署描述文件;容器会产生一个post-construction事件。
Bean class可以将方法标注为@PostConstruct,为该事件注册一个回调方法,该方法会在bean实例化后被容器调用。
Method-Ready Pool是一个实例池,由未被使用的Stateless session bean对象组成。因为可能有像依赖注入这样开销很大的操作,所以当这些实例不被使用时,将其暂存起来以备后续使用,这样更有效率。
Stateful session bean是客户端应用程序在服务器端的延续。它代表客户端执行各项任务,并维护着与客户端的会话状态。
和其他类型的bean不同,Stateful session bean是不使用实例池的。它在整个生命周期中只服务于一个客户端,因此对实例进行交换或实例池化都是不可能的。
Stateful session bean的生命周期:
Does Not Exist |
Method-Ready
|
@PreDesroy |
Class.newInstance() 注入@PostConstruct |
Passive |
超时 |
实例抛出系统异常 |
@PrePassive()
|
@PostActivatet |
超时 |
有三个状态:Does Not Exist,Method-Ready 和Passive
Does Not Exist:还未被实例化,即还没有存在于系统内存中;
Method-Ready状态:此状态下,可以自由接受来自客户端的调用请求;
Passive状态:当bean实例不为客户端提供服务时,可能会有一段时间处于不活跃状态。为节省服务器资源,容器可能会将bean实例钝化:将会话状态保存起来,并将bean从内存中移除。当bean实例被激活时,状态自动恢复。