EJB
容器创建和管理
session bean
实例
,
有些时候,你可能需要定制
session bean
的管理过程。例如,你可能想在创建
session bean
实例的时候初始化字段变量
,
或在
bean
实例被销毁的时候关掉外部资源
。上述这些,你都可以通过在
bean
类中定义生命周期的回调方法来实现
。这些方法将会被容器在生命周期的不同阶段调用(如:创建或销毁时)。
通过使用下面所列的注释,
EJB 3
允许你将任何方法指定为回调方法。这不同于
EJB 2
,
EJB 2
中,所有的回调方法必须实现,即使是空的
。
EJB 3
中,
bean
可以有任意数量,任意名字的回调方法。
·
@PostConstruct
:当
bean
对象完成实例化后,使用了这个注释的方法会被立即调用。这个注释同时适用于有状态和无状态的会话
bean
。
·
@PreDestroy
:使用这个注释的方法会在容器从它的对象池中销毁一个无用的或者过期的
bean
实例之前调用。这个注释同时适用于有状态和无状态的会话
bean
。
·
@PrePassivate
:当一个stateful
session bean
实例空闲过长的时间,容器将会钝化
(passivate)
它,并把它的状态保存在缓存当中。使用这个注释的方法会在容器钝化
bean
实例之前调用
。这个注释仅适用于有状态的会话
bean
。当钝化后,又经过一段时间该
bean
仍然没有被操作,容器将会把它从存储介质中删除。以后,任何针对该
bean
方法的调用容器都会抛出例外。该回调方法通常用于clean up resources, such as database connections, TCP/IP sockets, or any resources that cannot be serialized during passivation.
·
@PostActivate
:当客户端再次使用已经被钝化的有状态
session bean
时,新的实例被创建,状态被恢复
。使用此注释的
session bean
会在
bean
的激活完成时调用
。这个注释只适用于有状态的会话
bean
。该回调方法通常用于restore resources, such as database connections that we cleaned up in the PrePassivate method.
·
@Init
:这个注释指定了有状态
session bean
初始化的方法。它区别于
@PostConstruct
PostConstruct
注释在于:多个
@Init
注释方法可以同时存在于有状态
session bean
中,但每个
bean
实例只会有一个
@Init
注释的方法会被调用。这取决于
bean
是如何创建的(细节请看
EJB 3.0
规范)。
@PostConstruct
在
@Init
之后被调用。
·
@Remove
:仅适用
于有状态
session bean
。当应用通过存根对象调用使用了
@Remove
注释的方法时,容器就知道在该方法执行完毕后,要把
bean
实例从对象池中移走,保存的状态当然也就被清除
。注意:在使用完stateful session bean的实例后,要调用有@remove注释的方法,否则该实例及其维护的state data不会自动销毁(除非过了timeout),这样会提高性能!