您好,欢迎访问三七文档
第二章会话Bean(SessionBean)课程目标无状态会话Bean以及开发有状态会话Bean以及开发会话Bean的生命周期EJB3.0中的依赖注入技术定时器服务体验项目——用定时器做的闹钟图2-1测试页面运行结果图打包并部署本体验项目,之后在JBoss的bin目录下启动JBoss服务器,之后在浏览器的地址栏中输入“”,程序运行结果如图2-1所示:此时观察JBoss控制台的内容输出,10秒钟后会显示第一条提示信息:到时间睡觉的信息,再过10秒钟就会显示第二条提示信息:到时间起床的信息,如图2-2所示:图2-2JBoss服务器中的控制台输出信息无状态会话Bean的开发无状态会话Bean介绍无状态会话Bean是这样一种会话Bean,其服务的业务过程中只需要单个请求会话即可完成。由于它们不需要维护客户多个方法调用间的会话状态,因此它们是无状态的。在每次的方法调用结束之后,EJB容器可能会销毁无状态会话Bean的实例,或者实例化新的实例,或者清除掉上次方法调用中的相关信息。无状态会话Bean实例如下:用于解决复杂数据操作的高性能引擎(比如音频或者是视频数据的操作)无状态会话Bean的开发步骤一:首先要定义一个包含它所有业务方法的接口。比如接口的定义如下:HelloWorld.java:packagecom.ejb3;publicinterfaceHelloWorld{publicStringsayHello(Stringwhosay);}实现上面的接口并加入两个注释:@Stateless和@Remote,@Stateless注释定义这是一个无状态会话Bean;@Remote注释指明这个无状态会话Bean的Remote接口。步骤二:比如会话Bean实现代码如下:HelloWorldBean.java:importcom.ejb3.HelloWorld;importjavax.ejb.Remote;importjavax.ejb.Stateless;@Stateless@Remote({HelloWorld.class})publicclassHelloWorldBeanimplementsHelloWorld{publicStringsayHello(StringwhoSay){returnwhoSay+say:HelloWorld!;}}有状态会话Bean的开发有状态会话Bean介绍如果客户的服务过程能够延伸到多个方法请求或者事务中,为完成这种业务过程,我们就需要用到有状态会话Bean,有状态会话Bean需要为单个客户保存状态信息。如果在方法调用期间有状态会话Bean的状态发生改变,则这种状态必须反映到同一客户的随后调用中。相对无状态会话Bean来讲,有状态会话Bean要稍微复杂些。有状态会话Bean实例如下:保存操作业务状态的购物篮等。有状态会话Bean的开发一个Demo:开发一个有状态会话Bean有状态会话Bean接口定义的示例如下:Account.java:packagecom.ejb3;importjava.io.Serializable;publicinterfaceAccountextendsSerializable{publicintAdd(inta,intb);publicintgetResult();}这个接口很简单,和无状态会话Bean基本相同,增加了两个计算的方法add()和getResult(),用于处理逻辑运算。Account的实现代码:packagecom.ejb3;//导入需要的包@SuppressWarnings(serial)@Stateful@Remote({Account.class})publicclassAccountBeanimplementsAccount{//privatestaticfinallongserialVersionUID=1L;privateinttotal=0;privateintaddResult=0;publicintAdd(inta,intb){addResult=a+b;returnaddResult;}publicintgetResult(){total+=addResult;returntotal;}}客户端的测试代码核心代码如下:try{AccountA=(Account)ctx.lookup(AccountBean/remote);out.println(调用A.Add()的结果是:+A.Add(10,10));out.println(br调用A.getResult()的结果:+A.getResult());out.println(br================================);AccountB=(Account)ctx.lookup(AccountBean/remote);out.println(br调用B.Add()的结果是:+B.Add(10,10));out.println(br调用B.getResult()的结果:+B.getResult());out.println(再次调用A.Add()的结果是:+A.Add(10,10));out.println(br再次调用A.getResult()的结果:+A.getResult());}catch(Exceptione){}图2-3测试页面运行结果图页面运行结果如图2-3所示:无状态会话Bean和有状态会话Bean的区别对于会话Bean的两种子类型来讲,从功能上看,两者都可以将系统逻辑放在方法之中执行,不同的是有状态会话Bean是可以记录调用者的状态,因此每一个调用者都会有一个自己的实例。无状态会话Bean虽然也是逻辑组件,但是它却不负责记录调用者状态,也就是说当客户调用无状态会话Bean的时候,EJB容器并不会寻找特定的无状态会话Bean的实体来执行这个方法(或者是事务)。换句话讲,可能有多个用户在执行某个无状态会话Bean的方法时,会有同一个Bean的实例在执行。会话Bean的生命周期会话Bean(SessionBean)同其他企业Bean类型的最主要区别是生命周期的差异性。相比之下,会话Bean实例是存活时间很短暂的对象。粗略地看,它同会话(Session)或调用其客户的生命周期类似。而且,会话Bean实例并不能够在多个客户间共享,并且它不代表数据库中的数据。Bean生命周期的回调方法涉及到的几个注释:@PostConstruct@PreDestroy@PrePassivate@PostActivate@Init@Remove下图展示了一个EJB容器调用了无状态会话Bean实例中的方法。图2-4无状态会话Bean实例的生命周期状态分析上图中发生的各个步骤来解析无状态会话Bean的生命周期:(1)起初Bean实例并不存在。(2)EJB容器决定是否需要实例化新的Bean实例。(3)容器实例化Bean类。(4)EJB容器注入实例所需要的上下文依赖。(5)容器调用可选的@PostConstruct回调方法。(6)EJB容器调用Bean实例的业务方法。(7)容器调用@PreDestroy回调方法。有状态会话Bean的生命周期的介绍图2-5有状态Bean实例的生命周期状态会话状态,有状态会话Bean存在会话状态,因此不同的有状态会话Bean实例各不相同,这同无状态会话Bean实例是不一样的。挂起和激活会话状态是有状态会话Bean的专有行为,无状态会话Bean并不存在这两种行为有状态会话Bean的生命周期同无状态会话Bean类似。但还是存在着不同:一个演示会话Bean生命周期的Demo依赖注入依赖注入的概念依赖注入(DependencyInjection),又称作控制反转(IOC),它是一种设计模式,是用于控制对象之间的相互引用关系以降低对象之间的耦合度。一个Demo,说明什么是依赖。两个类:一个类Person,另一个类Car,如果Person的某个方法比如说drive(),需要引用Car类,则称Person类依赖于Car类EJB3.0引入依赖注入EJB3.0规范引入了依赖注入来用于引用资源和EJB相关对象。借助于该技术使得应用能够访问到所需要的对象。在传统的EJB技术规范中开发者需要使用JNDI才能够查找到应用所需要的资源,甚至开发者还要同资源引用、各种复杂的初始化属性打交道。EJB3.0中的依赖注入技术所用的几个重要注释:(1)@Resource注释(2)@Resources注释(3)@EJB注释(4)@EJBS注释(5)@PersistenceContext注释定时器服务定时器服务介绍EJB通过引入容器管理的EJB定时器服务使得EJB容器能够为EJB应用提供任务调度支持。开发者借助于各种定时器服务API能够同EJB定时器服务进行交互。在创建定时器的时候,开发者需要使用这些API,以指定日期和周期。同时开发者也能够创建重复执行任务的定时器。一旦定时器指定的时间或者是周期到来,Timer立即起作用,EJB容器便能够调用到EJB组件中的定时器回调方法。定时器服务API定时器服务API由如下4个接口构成:(1)javax.ejb.TimerService接口(2)javax.ejb.Timer接口(3)javax.ejb.TimedObject接口(4)javax.ejb.TimerHandle接口定时器服务示例一个演示定时器服务的Demo实践项目——定时计算收入的EJB组件一、程序的实现要求如下:(1)利用EJB3.0中的定时服务设计一个EJB组件能够定时的计算收入(每天、每月、每年)(2)每天的收入可以暂时假设为从0-1000不确定的一个随机数字。二、实现步骤(1)首先定义一个业务接口(2)实现该接口的业务Bean(3)编写一个简单测试页面来调用以上EJB组件本章总结无状态会话Bean以及开发有状态会话Bean以及开发会话Bean的生命周期EJB3.0中的依赖注入技术定时器服务
本文标题:第2章EJB3.0
链接地址:https://www.777doc.com/doc-3998490 .html