2008年12月3日星期三

JavaEE_006:会话Bean的生命周期 (摘录+整理)

客户会话(Client Session)的持续期决定了使用中的会话Bean的存活期,这就是术语“会话Bean”的来源。

1. 无状态会话Bean的生命周期

(1)在不同方法调用间不保留任何状态,即每次方法调用结束后,Bean实例都不记得曾经被调用过。
(2)无状态会话Bean不会“专门”地保存客户端的状态。
(3)无状态会话Bean实例池中的Bean实例都是“众生平等”的,每次调用时,都会从池中“随机”选择一个Bean实例来服务客户。
(4)需要传递方法执行过程中需要的所有参数。

2. 有状态会话Bean的生命周期

(1)可以在不同的方法调用间保持针对各个客户端的状态 。
(2)有状态会话Bean会保存客户端的状态。
(3)有状态会话Bean实例池的实现比无状态会话Bean实例池要复杂得多。
因为有状态会话Bean需要保存特定客户端的状态,一个客户端对应一个实例,即使在客户端没有任何请求时,也要为这个客户端保留这个实例。
这样随着客户端数量的增加,EJB容器创建的实例的数量也在增加,超过某个值之后,EJB容器将不再创建新的实例。虽然不创建新的实例,还是要响应用户请求的。
那么,EJB容器是如何做到的呢?它采用的是共享实例的策略。
EJB容器会查看哪个实例虽然处于连接状态(一般根据是最近最少使用原则 Least Recently Used:LRU),但是没有访问,然后把这个实例的状态保存起来,使用这个实例为新的请求服务,对于原来的客户端来说,称为挂起(Passivation)。
如果原来的客户端又发送请求了,会重新查找一个空闲的实例并且把已经保存好的状态恢复回来,这个过程称为激活(Activation)。
(4)不需要传递方法执行过程中需要的所有参数。

3. 生命周期回调
有些时候,当EJB容器创建和管理会话Bean实例时,你可能需要“介入”会话Bean的管理过程。
例如,你可能想在创建会话Bean实例的时候初始化字段变量、获得某些资源,或者在销毁会话Bean实例的时候释放某些资源。
上述这些,你都可能通过生命周期的回调来实现。这些方法将会被EJB容器在生命周期的不同阶段调用。
在EJB 3.0中,会话Bean可以有任意数量,任意名字的回调方法。
(1)@PostConstruct:在Bean类完成实例化后,EJB容器会立即调用此方法。比如给成员变量赋值。适用于有状态和无状态的会话Bean。
(2)@PreDestroy:在结束对@Remove方法调用之后,销毁Bean实例之前,EJB容器会立即调用此方法。比如释放分配给该Bean的所有资源。适用于有状态和无状态的会话Bean。
(3)@PrePassivate:在挂起Bean前,EJB容器会立即调用此方法。比如释放Bean实例持有的资源。只适用于有状态的会话Bean。
(4)@PostActivate:在激活Bean实例后,EJB容器会立即调用此方法。比如重新获得Bean实例在@PrePassivate期间释放的资源。只适用于有状态的会话Bean。
(5)@Init:初始化有状态Bean的方法。与@PostConstruct的区别在于:多个@Init注释方法可以同时存在于有状态Bean中,但每个Bean实例只会有一个@Init的方法会被调用,这取决于Bean是如何创建的。@PostConstruct在@Init之后被调用。
(6)@Remove:销毁有状态会话Bean实例的方法。只适用于有状态的会话Bean。

没有评论: