我今天学习了徐老师讲的EJB3的知识,我做了简单的笔记:
SLSB无状态会话Bean的编程规则;
EJB类
编程规则
至少有一个业务接口
必须是具体类.不能是final或抽象的.
必须有空构造
可以是其它sessionbean或pojo的子类
@Stateless
public CustomerManagerBean extends BaseManagerBean
implements CustomerManager {
...
}
生命周期回调方法可以定义在bean类中或超类中.
注解继承需要受到限制,超类中@Stateless or @Stateful注解在部署时将
要被忽略.但定义的任何回调方法和资源注入都要被继承.
业务方法名不能以ejb开头,可能会干扰ejb底层处理.必须定义所有的方法为
public的,但不能是final或static的.在远程业务接口中的定义的参数和返回
值类型必须实现java串行化接口.
会话状态和Session bean类型
如果bean要维护会话状态,记住上次交流的结果,这是有状态的会话bean.这意味
着bean会从方法调用中存储数据到实例变量,并使用缓存的数据来处理下一次方
法调用.
SLSB不维护任何状态,SFSB趋向于对多个步骤的工作流进行建模,SLSB则趋向与
对常规目的进行建模. SFSB典型案例就是购物车.
SLSB-生命周期回调
Bean的生命周期回调
session bean有生命周期,意味着会有一系列状态的转变.客户端和bean都不
负责bean实例何时创建,何时销毁,何时进行优化.这些行为都由容器进行管理.
生命周期事件:
可以归结为几个阶段或事件.最明显的是创建和销毁,所有的bean都需要这两个事
件.SFSB还会有passivation(钝化)/activation(激活).
bean初始化时,会发生如下过程:
1.容器调用newInstance方法.
2.如果bean使用DI,所有依赖的资源、bean和环境组件都要注入进来.
回调方法是被注解标注的方法.比如@PostContruct和@PreDestroy.方法可以是
公有、私有、受保护和包保护的.
PostConstruct:实例创建并DI之后调用.
PreDestroy:bean销毁前调用,比如释放资源.
所有sessionbean都有以上两个事件.
SFSB有两个额外的事件:PrePassivate和PostActivate.
生命周期方法也可定义在bean类中或单独的拦截器类中.
SFSB-特征
SFSB要确保维护会话状态,和SLSB唯一的不同就是容器如何维护他们的生命周期.
容器要保证客户端若干次调用中使用的是同一个bean.因此SFSB和客户端是一对一
映射在一起的.这种关系保证了会话状态的维护,但是也增加了成本.他不能被返回到
池中,而且用户会话活动时还要重用.bean实例驻留于内存中以备客户下个请求使用.
当有大量并发客户持久SFSB时,会有内存开销问题.优化技术就是passivation钝
化.
SFSB编程规则
SFSB实例变量用于存储会话状态,这些变量必须是java基本数据类型或实现串行化接口.
SFSB由于不能池化和进行重用,如果没有方式进行销毁会非常危险,因此必须定义业务方法进行销毁.我们使用@Remove注解.
除了postContruct和preDestory外,SFSB还有prePassivate和
postAcitivate生命周期回调方法.分别在钝化前和激活后调用.
SFSB的钝化/激活
如果客户端长时间没有调用bean,若还驻留在内存中的话,会引起内存耗尽.容器会
启用钝化技术将bean缓存至磁盘,来节省内存.
注:钝化本质上就是将bean缓存至磁盘来释放内存空间.容器通过串行化技术完成这一功能,可将数据存放到存储设备上(文件或DB).激活刚好相反,将数据进行反序列化再载入到内存.
prePassivate回调方法用于准备数据的串行化,或者对无法串行化的变量复制到可
串行化的变量中,或者清除不需要串行化的数据. 比如关闭数据库连接 消息服务器
和套接字连接等等.
大多数时候prePassivate和preDestroy方法回调会指定相同的操作.
今天学习的知识就是这么多了,希望明天有更好的状态学习。