EJb状态和无状态bean区分

前言

最近在学习Ejb的会话bean,发现对于有无状态bean不是特别的了解,有无状态bean其实是两种思想,在不同的场景下是使用不同的思想,所以也没有好与不好之分,我感觉都挺好的


What SessionBean

SessionBean用于实现业务逻辑,他可以是有状态的也可以是无状态,当客户请求的时候,它会发送一个SessionBean来为客户端服务


对象状态

对象的在状态分为实例变量和类变量,实例变量指的非静态变量,类变量是与类相关的变量,一般是静态变量,静态变量在代码中一般用static表示。
对于有无状态,我可以判断有多个类的时候,类是否可以区分,如果可以区分那么就是无状态类,如果不可以区分那就是状态类


有状态&&无状态

有状态:表示Ejb可以为一个客户端在多次调用请求的时候保存状态信息,可以进行数据存储功能,并且有实例变量对象,可以保存数据,属于非线程安全,

无状态:容器会使用实例池的方式,甚至单利的方式来实现无状态方式,因为Ejb容器不会对无状态的bean进行管理,所以我们每次只需要从实例池中哪去一个实例就可以,因为他们的状态都是一样的,所以没有状态区分,不可以保存数据,并且没有实例变量对象,是不变类,线程是安全的

有状态SessionBean为了区分不同的对象,容器每次都创建对象,无状态bean为了提高效率(复用)可以创建一个单例或者一个实例池,很好的体现了复用的思想


区别

有状态的SessionBean的主键关键字Statful,无状态注解的关键字是StateLess
对于无状态的bean来说我们不需要为每一个客户端分配一个Ejb实例,直接用池里面的就行,但是有状态的bean,必须为每一个客户端创建一个实例对象


生命周期

Ejb的生命周期是指在Ejb运行中经历的阶段和状态
无状态
1对于无状态的bean来说他不需要维护与客户端之间的会话
1.创建无状态SessionBean实例
2Ejb容器对Ejb实例进行依赖注入
3执行@PostConstruct回调方法
4进行待命状态
5垃圾回收
EJb状态和无状态bean区分_第1张图片


有状态的session,生命周期复杂,需要维护客户端状态
有状态的bean可以接受客户端的调用,一旦某一个客户端进行调用的时候,那么该客户端与服务器之间就会保存会话状态,所以这样只能会被该客户端自己调用,不能被其他客户端调用,所以相当于这个客户端一直在霸占着状态bean,这个时候我们不能让他一直被占用状态bean,所以这个时候我们就他转入去活状态,这样也保证了我们的资源和空间不浪费,如果这个时候客户端再调用的时候我们需要把在去活状态下的状态bean转换为待命的状态,如果客户单端退出则我们的状态bean也就被销毁了
EJb状态和无状态bean区分_第2张图片


@Prepassivate:表示从待命状态到活状态
@PostActivate:从去活状态中恢复出来后被调用,变为待命状态
@Remove:表示客户端通知服务器删除有状态的SessionBean


总结

这块的东西感觉需要进行代码实践,但是不知道应该怎么下手,愁了白了头,嘿嘿

你可能感兴趣的:(EJb状态和无状态bean区分)