无状态会话BEAN的生命周期很简单,只有两种状态:Does not exist和method-ready pool。
Method-Ready Pool是一个实例池,由未被使用的无状态会话BEAN对象组成。因为可能会有像依赖注入这样开销很大的操作,所以当这些实例不被使用的时候,将其存起来以备后续使用。这也是无状态会话BEAN和有状态会话BEAN的最大的区别。
无状态会话BEAN的生命周期:
Does not exist--(Class.newInstance()注入@PostConstruce)--Method-Ready-Pool--(@PreDestroy)--Does not exist
Does not exist状态:表示他在系统内存中没有实例存在,也就是没有被初始化。
Method-Ready POOL状态:当实例进入该状态,EJB服务器首次启动的时候,可能会创建一些无状态BEAN的实例,并使他们进入该状态(服务器的实际行动取决于具体实现)。当无状态BEAN的数量不足以为客户端请求提供服务,服务器将创建更多的实例,并将它添加到实例池中。
当实例从Does not exits到method-ready pool会执行三步操作:
1.容器首先调用无状态会话BEAN的Class.newInstance()方法来构造BEAN的一个实例。
2.容器通过注解或配置文件,将任何BEAN的元数据中声明的所需资源注入进来。
3.EJB容器会产生一个post-construction事件,BEAN可以将方法标注为@PostConstruct注解,为该事件注册一个回调方法。被标注的方法将在实例化以后被容器调用。回调方法可以使用任何名称,但是他必须返回VOID,不带参数,不能抛出任何checkde exception.每个BEAN只能定义一个@PostConstruct方法。
服务端代码:
接口:
package com.stateless.bean;
import javax.ejb.Remote;
@Remote
public interface TestStateless {
public String sayHello(String name);
}
实现类:
package com.stateless.bean;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.Stateless;
@Stateless
public class TestStatelessImpl implements TestStateless {
@PostConstruct
public void myInit()
{
System.out.println("初始化无状态会话BEAN");
}
@PreDestroy
public void myDestroy()
{
System.out.println("初销毁无状态会话BEAN");
}
public String sayHello(String name) {
// TODO Auto-generated method stub
return "hello!"+name;
}
}
客户端:
public static void main(String[] args) {
try {
InitialContext context = getInitialContext();
TestStateless ts = (TestStateless) context.lookup("TestStatelessImpl/remote");
System.out.println(ts.sayHello("tuping"));
} catch (Exception e) {
e.printStackTrace();
}
}
在服务端接到请求以后,会打印:
08:47:01,718 INFO [STDOUT] 初始化无状态会话BEAN
表示调用以前,首先会调用@PostConstruct标签的方法。
处于method-ready pool状态,他就已经为响应客户端请求做好准备,当客户端调用EJB业务方法时,EJB容器会委派给任何一个处于该状态的BEAN实例,如果某个BEAN实例正在处理请求,那么直到它完成了相应的处理以后,才可以为其他的EJB所用。
当以个BEAN实例被换入,他的sessioncontext便会改变,以反映与之关联的EJB OBJECT的上下文。
离开method-ready pool状态,当EJB容器不再需要BEAN实例的时候,这一过程从BEAN的PREDESTROY事件被触发的那一刻开始,BEAN可以为某个方法添加PreDestroy注解,以响应该时间的回调方法。回调方法可以是任何名称,不带参数,返回为VOID。不能跑出任何异常。每个BEAN职能定义一个@PreDestroy方法。