会话EJB系列(三)SessionBean生命周期

(上一篇文章中我们介绍了《会话EJB系列(二)EJB分类》
,本文的核心为:SessionBean的生命周期)

EJB生命周期:指EJB在运行过程中经历的阶段和状态。

首先强调的是:SessionBean的生命周期是由容器控制的而不是应用程序!对于客户端是完全透明的。但是对于开发者而言,必须了解SessionBean在EJB中的运行规律,才可以更好的管理SessionBean。当然允许被开发者改变。

在前面的文章中我们提到过,可以将EJB容器理解为Spring容器,运行在EJB中的SessionBean就像运行在Spring容器中的POJOBean

一.无状态SessionBean的生命周期

无状态的SessionBean,生命周期比较简单,不需要维护它与客户端之间的会话。

EJB容器通过一个EJB池来维护无状态的SessionBean,该池中有多个无状态SessionBean的实例,切均处于待命状态(准备被客户端调用),当客户端通过JNDI查找实体获取某个无状态的SessionBean时,EJB容器将直接从EJB池中取出一个空闲的EJB供客户端调用,调用完后,将SessionBean再次返回到EJB池中。

一个无状态的SessionBean实例的生命周期,如下:

(1)创建无状态SessionBean实例

(2)EJB容器对EJB实例执行依赖注入(类似Spring的依赖注入)

(3)执行@PostConstruct回调方法

(4)进入待命状态

(5)执行@PreDestory回调方法

(6)垃圾回收

从下图中,可看出无状态的SessionBean的三种状态:不存在状态、待命状态、被销毁状态

二.有状态SessionBean的生命周期

有状态的SessionBean,生命周期稍微复杂,这是因为需要维护客户端的状态。

当它处于待命状态之后,它可以接受一个客户端的调用,一旦有某个客户端调用它之后,那么他就持有该客户端与服务器之间会话状态信息,这些信息导致它只能被该客户端调用,不能被其他客户端调用。如果SessionBean对应的客户端长时间不再调用它,那么EJB容器就不能让它一直处于EJB容器中(占着位置,但又不干活),这对系统资源是一种巨大的浪费,因此EJB容器将会把该SessionBean转入去活状态。

当一个有状态的SessionBean处于去活状态后,如果在有限时间内,该EJB对应的客户端再次调用了该SessionBean,那么EJB容器将会把该SessionBean从去活状态中恢复过来,让它重新转入待命状态,这样他就可以再次向客户端提供服务了。

EJB容器在将一个有状态的SessionBean转入去活状态之前,会先调用该EJB内以@PrePassivate修饰的方法;

EJB容器在将一个处于去活状态的SessionBean恢复到待命状态之前,会先调用该EJB内以@PreDestory修饰的方法

由图可以看出,有状态的SessionBean比无状态的SessionBean多了一个生命周期的状态:去活状态

因此也就出来两个Annotation:@PrePassivate,@PreDestory

三.自定义生命周期

掌握了无状态SessionBean和有状态的SessionBean的生命周期后,开发者可以通过EJB定义使用特定Annotation修饰的方法来定制SessionBean的生命周期行为。共5个:@Init、@PostActivate、@PrePassivate、@PostConstruct、@PreDestroy

(此处‘调用’,均指‘被EJB容器调用’)

与无状态SessionBean生命周期行为有关的Annotation有位于javax.annatation包下,2个:

@PostConstruct:在EJB创建之后被调用

@PreDestory:在EJB被销毁之前被调用

与有状态的SessionBean生命周期行为有关的Annotation有位于javax.ejb包下,2个:

@PostActivate:从去活状态中恢复出来后被调用,该方法执行完成后,再次进入待命状态。

@PrePassivate:在去活之前被调用

@Remove :客户端通知服务器删除有状态的SessionBean。

(它修饰的方法与生命周期相关,但并不属于生命周期方法。实际上应该属于一个业务方法,它用于被客户端调用,当客户端调用某个有状态SessionBean的@Remove修饰的方法以后,就相当于客户端通知服务器应该删除该有状态的SessionBean,因此EJB容器将会立即调用该SessionBean中@PreDestory修饰的方法,接下来就销毁该SessionBean。)

总结

本文主要阐述有状态SessionBean和无状态的SessionBean的在EJB中的运行规律,方便开发者对SessionBean更好的管理,需要强调的是:SessionBean的生命周期是由容器控制的而不是应用程序

时间: 2024-10-11 01:56:26

会话EJB系列(三)SessionBean生命周期的相关文章

会话EJB系列(四)SessionBean事务管理

(上一篇文章中我们介绍了<会话EJB系列(三)SessionBean生命周期>,本为的主要介绍SessionBean中事务管理) SessionBean从功能上可以分为两类: 第一类:成为EAO:用于封装底层的实体和JPA,本质上其功能就是DAO.(不需要事务控制.因为JPA本质是对ORM实现的封装.) 第二类:充当业务组件:是底层EAO对象的Facade,系统控制器(如struts中的Action,springMVC中的Controller)将调用他们的业务方法来处理用户请求.(需要添加事务

会话EJB系列(五)拦截器

上一篇文章<会话EJB系列(四)SessionBean事务管理>中,我们介绍了SessionBean的事务管理机制. 本文主题'拦截器',详细介绍其用途.作用.与Spring框架AOP的对比,并介绍其初步用法. 一.简介 企业级应用中经常面对的事务管理.安全检查.缓存.对象池管理等,为此Spring框架提供了AOP方式,灵活控制业务方法!而EJB3没有提供AOP支持,那么他又是如何应对的呢? JavaEE规范中提供的横切性服务:事务管理和安全检查. EJB容器实现JavaEE规范 用CMT解决

会话EJB系列(二)EJB分类

(本文承接上一篇文章<会话EJB系列(一)EJB概述>,继续对EJB内容展开详细解说) EJB规范中定义了三种Bean: 会话Bean(Session Bean) 实体Bean(Entity Bean) 消息驱动Bean(MessageDrive Bean) 一.SessionBean的概念和作用 (1)定义 作用:用于处理业务逻辑的完整组件. 当SessionBea部署在在EJB容器中后,客户端获取该EJB组件,并调用它的方法,至方法结束,称为:客户端与SessionBean之间的一次会话,

Spring Environment(三)生命周期

Spring Environment(三)生命周期 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) Spring Environment 属性配置管理系列文章: Spring Environment(一)API 介绍 Spring Environment(二)源码分析 Spring Environment(三)生命周期 一.Environment 初始化 每个 ApplicationContext 容器初始化时都会执行

Maven系列学习(三)Maven生命周期和插件

Maven生命周期和插件 Maven另外的两个核心概念就是生命周期和插件,Maven的生命周期都是抽象的,其实实际行为都是由插件来完成的,生命周期和插件两者协同工作 1.生命周期 Maven的生命周期就是为了对所有的构建过程进行抽象和统一,这个生命周期包含了项目的清理,初始化,编译,测试,打包,集成测试,验证,部署和站点生成等几乎所有构建步骤,Maven的生命周期是抽象的,这意味着生命周期本身不做任何实际的工作,在Maven的设计中,实际的任务都是交给插件来完成的 一次构建(build):ini

Maven学习笔记之——三套生命周期

Maven学习笔记之--三套生命周期 Maven命令的输入往往就对应了生命周期.比如mvncompile就表示执行默认生命周期阶段compile.Maven的生命周期是抽象的.其实际行为都是由插件完成的.比如mvncompile就可能会由maven-compile-plugin完成.生命周期和插件是协同工作. 1.    何为生命周期 项目构件中进行的清理.编译.测试及部署都可以视作一个一个项目的生命周期.但是每个项目每个人都有不一样的顺序不一样的实现方式.没有统一性带来的不方便已经不言而喻.

RxJava 和 RxAndroid 三(生命周期控制和内存优化)

RxJava 和 RxAndroid 三(生命周期控制和内存优化) rxjava rxandroid 前言:对Rxjava.Rxandroid不了解的同学可以先看看 RxJava 和 RxAndroid RxJava 和 RxAndroidRxJava 和 RxAndroid 二(操作符的使用) RxJava使我们很方便的使用链式编程,代码看起来既简洁又优雅.但是RxJava使用起来也是有副作用的,使用的越来越多的订阅,内存开销也会变得很大,稍不留神就会出现内存溢出的情况,这篇文章就是介绍Rxj

Maven-04: 三套生命周期

Maven的生命周期不是一个整体,而是拥有三套相互独立的生命周期,它们分别是clean,default和site. clean生命周期的目的是清理项目. default生命周期的目的是构建项目. site生命周期的目的是建立项目站点. ---------------------------------------------------------------------------------- clean生命周期: 1) pre-clean: 执行一些清理前需要完成的工作. 2) clean

android核心系列--1,组件生命周期

一,进程模型及进程托管 1,一个APP应用是由一个或多个组件构成的,这些组件可以运行在一个进程中,也可以分别运行在多个进程中: 进程的构造和销毁是由系统全权负责的. 2,一个应用进程只有一个应用环境对象,它在第一个应用进程的组件加载之前被构造,在应用进程中最后一个组件结束后销毁. 3,组件可以通过 android:process = ":com.zy.tool.another"  将组件配置到指定的进程中,冒号开头表示这是一个私有进程,只有本应用的组件才能使用该进程. 如果是小写字母开