EJB3(无状态会话BEAN)

无状态会话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方法。

你可能感兴趣的:(bean,ejb)