ejb的bean类型有三种:session bean,message-driven bean,entity bean。其中session bean又分为有状态bean(@Stateful, SFSB)和无状态bean(@Stateless, SLSB)。
来传智播客之前听过网上黎活明老师的ejb3视频。网上黎活明老师的视频可能是因为有删节,有状态bean和无状态bean只是简单讲了一点--删节版,徐培成老师的课上这这两种bean讲得很细--现场版,因为讲得太细了,所以特意拎出来写一篇。而消息驱动bean,两个老师的授课知识互有补充(当然了,大部分知识还是重叠的),下一篇写。这两个老师都是传智播客众多优秀的老师之一,为人随和,经验丰富,讲课没有废话,而休息时会介绍一些业内动态,上课节奏把握得较好。如果想较快掌握ejb3知识细节,想听两位好老师的ejb3课程,那就快来传智播客吧:)
咳咳,进入正题。
首先,理解SLSB与SFSB:
1、客户端并不关心SLSB的内部状态,SLSB没有必要维护在两次调用中维护实例变量的值。
2、SFSB确保客户端设置bean的内部状态以及即使任意次方法调用数量还是保持不变.容器保证这一目的要做两件幕后的事情:
首先,容器要保证客户端可以到达该bean。
其次,容器在你不需要手写代码的情况下维护bean的实例变量。
3、SFSB趋向于对多个步骤的工作流进行建模,SLSB则趋向与对常规目的进行建模。SFSB典型案例就是购物车。
编程规则:
1、SLSB编程规则:
(1)至少有一个业务接口。
(2)必须是具体类,不能是final或抽象类。
(3)必须有空构造函数。
(4)可以是其它sessionbean或pojo的子类。
(5)生命周期回调方法(回调方法是被注解标注的方法,比如@PostContruct和@PreDestroy)可以定义在bean类中或超类中。
(6)注解继承需要受到限制,超类中@Stateless or @Stateful注解在部署时将要被忽略。但定义的任何回调方法和资源注入都将被继承。
(7)业务方法名不能以“ejb”开头,可能会干扰ejb底层处理--因为在早期的ejb版本中,程序代码必须实现的接口名几乎都是以“ejb”开头的,而新版本的产品一般都会向后兼容,所以可能会对现有版本产生干扰--个人猜测可能是早期的底层代码中有以硬编码方式将“ejb”字符串写入到程序中进行相应处理的内容。
(8)必须定义所有的方法为public的,但不能是final或static的.在远程业务接口中的定义的参数和返回值类型必须实现java串行化接口。
2、SFSB编程规则,除了上述SLSB的之外,还包括:
(1)SFSB实例变量用于存储会话状态,这些变量必须是java基本数据类型或实现串行化接口。
(2)SFSB由于不能池化和进行重用,如果没有方式进行销毁会非常危险,因此必须定义业务方法进行销毁.我们使用@Remove注解。
(3)除了postContruct和preDestory外,SFSB还有prePassivate和postAcitivate生命周期回调方法。分别在钝化前和激活后调用。
(4)注意不要注入SFSB到SLSB中,因为一个SLSB可能会被多个客户端共享,可能会出问题。但是相反则是比较好的做法。
生命周期:
1、session bean有生命周期,意味着这些bean会有一系列状态的转变。客户端和bean都不负责bean实例何时创建,何时销毁,何时进行优化。这些行为都由容器进行管理。在所有session bean的生命周期中,都有创建和销毁这两个事件,而SFSB还会有passivation(钝化)/activation(激活).
2、bean初始化时,会发生如下过程:容器调用newInstance方法;如果bean使用DI,所有依赖的资源、bean和环境组件都要注入进来。session bean的初始化可以在装载配置文件时开始,也可以在用户首次调用该bean时开始。
3、池化:类似数据库的连接池。只有SLSB可以池化。因为它们没有状态,所以可以共享。而SFSB与客户端是一对一的绑定关系(想象一下银行的普通服务窗口的一般员工和某些针对特定VIP客户的客户经理)。ejb的“池”开启时会先创建一定的bean实例(默认的数目,不过不知道具体是多少),如果不够用了再创建新的实例。SLSB一般是等“池”销毁的时候销毁,例如宕机的时候,或者必要的时候人为销毁。SFSB则是被客户端删除或超时的时候被销毁。另,如果客户端删除了SFSB,则和SFSB相关联的其他bean也会一同被删除。
4、SLSB通过少量的实例来处理实际的并发的访问。理论上可以有多个@postContruct和@preDestroy生命周期回调方法,但很少这样做:PostConstruct--实例创建并DI之后调用,PreDestroy--bean销毁前调用,比如释放资源;生命周期回调方法不能有参数,而且不能抛出受检查的异常(运行时异常的子类)。
5、钝化与激活:SFSB要维护会话状态,意味着bean会从方法调用中存储数据到实例变量,并使用缓存的数据来处理下一次方法调用。SFSB实例驻留于内存中以备相应的客户下个请求使用,但是当有大量并发客户持久SFSB时,会有内存开销问题。优化技术就是passivation钝化。钝化本质上就是将bean缓存至磁盘来释放内存空间。容器通过串行化技术完成这一功能,可将数据存放到存储设备上(文件或DB)。激活刚好相反,将数据进行反序列化再载入到内存。prePassivate回调方法用于准备数据的串行化,或者对无法串行化的变量复制到可串行化的变量中,或者清除不需要串行化的数据。比如关闭数据库连接、消息服务器和套接字连接等等。大多数时候prePassivate和preDestroy方法回调会指定相同的操作.
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fjf133/archive/2010/01/12/5183015.aspx
另外详解EJB 3会话 Bean,可参考:http://tech.it168.com/j/2007-11-15/200711151141125.shtml
分享到:
相关推荐
有状态会话Bean(Stateful Session Bean,SFSB)与无状态会话Bean(Stateless Session Bean, SLSB)的主要区别在于它们如何维护与客户端之间的交互状态。SLSB不存储任何关于客户端的信息,每次方法调用都是独立的,...
4. **无状态会话Bean(SLSB)**:与SFSB相反,SLSB不保存任何会话信息,每次调用都是独立的,适合执行无状态的操作,如计算、验证等。 5. **Web服务(Webservice)**:Web服务允许不同系统之间的通信,采用标准协议...
"chapter03_jpa_version"可能涉及JPA的不同版本及其改进,而"chapter03_jpa_sfsb"和"chapter03_jpa_inheritance_joinedtable_client"可能讲解了如何使用JPA处理会话bean(Session Facade)和实体类的继承策略(如...
在传统的EJB 2.x时代,`ejbCreate`方法被用于无状态会话bean(Stateless Session Beans, SLSB)和有状态会话bean(Stateful Session Beans, SFSB)的实例化过程。对于SLSB,`ejbCreate`会在每次客户端请求一个新的...
主要的EJB类型包括:无状态会话Bean(Stateless Session Beans, SLSB)、有状态会话Bean(Stateful Session Beans, SFSB)、消息驱动Bean(Message-Driven Beans, MDB)以及实体Bean(Entity Beans,通常使用JPA进行...
在EJB 2.x版本中,`ejbCreate`方法是无状态会话Bean(Stateless Session Bean, SLSB)和有状态会话Bean(Stateful Session Bean, SFSB)的标准生命周期方法之一。当EJB容器创建一个新的Bean实例时,会自动调用这个...
- **无状态会话bean(Stateless Session Beans, SLSB)**:不保留任何客户端状态,适合执行计算任务或提供共享服务。 - **有状态会话bean(Stateful Session Beans, SFSB)**:可以跟踪客户端状态,常用于购物车或...
Java EE 5.0简化了EJB,引入了无状态会话bean(Stateless Session Beans, SLSB)和有状态会话bean(Stateful Session Beans, SFSB),并提供了实体bean(Entity Beans)的注解驱动模式,使得部署和配置更加简单。...
- **作用**:创建一个新的Java接口和SLSB(Stateless Session Bean),并附带Seam和EJB3的注解(Annotations)。 2. **`new-form`** - **命令示例**:`seam.bat new-form` - **作用**:创建一个Java接口和SFSB...