关于session bean的一些问题
EJB里面,session bean是占了挺重要的地位的,一些重要的事情都是交给session bean来处理的
session BEAN一般用于操作一些对外的方法,供客户调用.会话BEAN分两种,一种 是有状态的会话BEAN,一种 是无状态的会话BEAN,它们有什么不同呢?
有状态的会话BEAN,会记录每一个调用者的状态,每个人都有一个自己的实例,相比之下,它比较耗内存.一般用于做专用的事情
无状态的会话BEAN,则不会记录每一个调用者的状态,所有人共有一个实例,所以它不耗内存,一般用于做一些通用的事情
会话BEAN中有一种叫定时服务,并不是所有的会话BEAN都可以有定时服务器,而只有无状态的会话BEAN可以有定时的服务,如果调用的是有状态的会话BEAN的话,那么运行时就会出异常,不知道是不是有状态的会话BEAN不允许有定时服务.对于会话BEAN,我们可以掌握它的生命周期
EJB容器创建和管理session bean实例,有些时候,你可能需要定制 session bean的管理过程。例如,你可能想在创
建session bean实例的时候初始化字段变量,或在bean实例被销毁的时候关掉外部资源。上述这些,你都可能通过
在 bean 类中定义生命周期的回调方法来实现。这些方法将会被容器在生命周期的不同阶段调用(如:创建或销
毁时)。通过使有下面所列的注释,EJB 3.0允许你将任何方法指定为回调方法。这不同于 EJB 2.1,EJB 2.1中,
所有的回调方法必须实现,即使是空的。EJB 3.0中,bean可以有任意数量,任意名字的回调方法。
·@PostConstruct:当bean对象完成实例化后,使用了这个注释的方法会被立即调用。这个注释同时适用于
有状态和无状态的会话bean。
·@PreDestroy:使用这个注释的方法会在容器从它的对象池中销毁一个无用的或者过期的 bean 实例之前调
用。这个注释同时适用于有状态和无状态的会话 bean。
·@PrePassivate:当一个有状态的session bean实例空闲过长的时间,容器将会钝化(passivate)它,并把它的
状态保存在缓存当中。使用这个注释的方法会在容器钝化bean实例之前调用。这个注释适用于有状态的会话bean。
当钝化后,又经过一段时间该 bean 仍然没有被操作,容器将会把它从存储介质中删除。以后,任何针对该 bean
方法的调用容器都会抛出例外。
·@PostActivate:当客户端再次使用已经被钝化的有状态 session bean 时,新的实例被创建,状态被恢复。
使用此注释的session bean会在bean的激活完成时调用。这个注释只适用于有状态的会话 bean。
·@Init:这个注释指定了有状态session bean初始化的方法。它区别于@PostConstruct注释在于:多个@Init
注释方法可以同时存在于有状态session bean 中,但每个 bean实例只会有一个@Init注释的方法会被调用。这取
决于bean是如何创建的(细节请看EJB 3.0规范)。@PostConstruct在@Init之后被调用。
另一个有用的生命周期方法注释是@Remove,特别是对于有状态 session bean。当应用通过存根对象调用使用了
@Remove注释的方法时,容器就知道在该方法执行完毕后,要把 bean实例从对象池中移走。
这里要注意的一点是,对于无状态的会话BEAN,即使你调用了标记为@Remove的方法,这个会话BEAN依然有效,所以,这个注释应该用在有状态的会话BEAN中,这样当你调用了它所标记的方法 后,再调用这个会话BEAN的其它方法就会抛出一个异常
javax.ejb.EJBNoSuchObjectException: Could not find Stateful bean:它会说找不到这个有状态的会话BEAN了,因为这个时候经过你调用了标记为@Remove的方法后,EJB容器已经将它销毁了,以后的任何调用都是无效的了,这样有利于我们更好的掌握会话BEAN的生命周期,免得产生很有有状态的会话BEAN的时候,过多的消耗服务器的内存.