1. 有状态会话Bean会为每一个客户端创建一个实例,保持了用户的信息,如购物车,用户每调用一次lookup()都将创建一个新的Bean实例,如果希望一直使用某个Bean实例,则必须在客户端缓存存根。
2. 开发Statefull Session Bean 与Stateless Session Bean 的开发步骤相同
@Stateful
@Remote(Cart.class)
public class CartBean implements Cart {。。。。}
3. Statefull Session Bean 最好实现Serializable接口,这样EJB容器才能在它们不再使用时把它们序列化保存到硬盘上。
4. Statefull Session Bean 的生命周期包含3种状态:does not exist、method-ready和passivated。
5. 可以通过注释定义Session Bean的生命周期事件的回调方法,在EJB3.0,Bean可以有任意数量、任意名字的回调方法。
6. 拦截器可以拦截Session bean 和 Message-Driven Bean 的方法或生命周期事件。拦截器可以使同一Bean类中的方法或是一个外部类。
@Stateless
@Remote(HelloChinaRemote.class)
@Local(HelloChina.class)
@Interceptors(HelloInterceptor.class)
public class HelloChinaBean implements HelloChinaRemote, HelloChina {..}
@Interceptors注释指定一个或多个在外部类中定义的拦截器,多个拦截器类之间用逗号分隔,如@Interceptors({A.class,B.class,C.class}),如果只有一个拦截器可省略大括号。如果只需对某一个方法进行拦截,可以将该注释标注在方法上面。
7. 拦截器:
public class HelloInterceptor {
@AroundInvoke
public Object log(InvocationContext ctx) throws Exception{
//在这里插入代码
return ctx.proceed();
}catch(Exception e) {
throw e;
}
}
@ AroundInvoke 注释指定了要用作拦截器的方法,用@AroundInvoke注释指定的方法必须遵守以下格式:
public Object XXX(javax.interceptor.InvocationContext ctx) throws Exception
<? xml version = "1.0" encoding = "UTF-8" ?>
< ejb-jar version = "3.0" xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:xml = "http://www.w3.org/XML/1998/namespace" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd " >
< assembly-descriptor >
< interceptor-binding >
< ejb-name > * </ ejb-name >
< interceptor-class > cn.csu.ejb3.imple.HelloInterceptor</ interceptor-class >
</ interceptor-binding >
</ assembly-descriptor >
</ ejb-jar >
l <ejb-name>*</ejb-name> 指明拦截所有的 EJB 的所有方法。如果只想拦截某一个 EJB ,则可以用这个 EJB 的名称替换通配符“ * ”。其效果和在 Bean 类上标识 @Interceptor 的效果 是一样的。
l <intercepter-class> 用来指定拦截器类。
通过@ExcludeDefaultInterceptors注释禁用默认拦截器,该注释加在类上面。
8 通过 @EJB 注释可以注入 EJB, 通过 @Resource 可以注入资源类型。