传智播客-ejb3(2)-SLSB与SFSB

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方法回调会指定相同的操作.

 

关于SLSB和SFSB更详尽的知识和应用,欢迎来传智播客聆听:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值