一篇博客带你拿下吉林大学JAVAEE期末(七:会话Bean)

Posted AI_SJTU

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇博客带你拿下吉林大学JAVAEE期末(七:会话Bean)相关的知识,希望对你有一定的参考价值。

1.会话Bean分类

1)无状态会话Bean
  • 无状态会话Bean不维持和客户端的会话状态
  • 当方法结束的时候,客户端特定的状态就不会被保持。
  • 允许EJB容器将一个实例分配给任意一个客户端。
2)有状态会话Bean

有状态会话Bean是一种保持会话状态的服务,每个实例都与特定的客户端相关联,在与客户端的方法调用之间维持对话状态

3)单例会话Bean
  • 单例会话Bean在每个应用程序中只被实例化一次,在整个应用程序的生命周期中存在。
  • 单例会话Bean提供了和无状态会话Bean类似的功能,区别是单例会话Bean在每个应用程序中只有一个实例,而无状态会话Bean会有一个实例池

2.会话Bean组成

1)业务接口
  • 远程接口
  • 本地接口
2)EJB实现类

3.无状态会话Bean开发方法

无状态会话Bean客户端通过JNDI引用会话Bean,在客户端通过JNDI访问会话Bean的远程接口的方法有两种:

使用通用JNDI API:
  • 别忘了四个要素(服务器命名和目录管理地址,上下文环境工厂,用户名,密码。然后ctx= new InitialContext(property),通过ctx.lookup查找对象,再强制转换为需要的类型)为什么JNDI可以找到别忘了会话Bean的运行原理部署到服务器后会将JNDI命名发布。
使用EJB Client API:
  • 新建一个普通Java Project工程,把jboss-client.jar加入到项目;
  • 将HelloBeanRemote.java文件按照原有路径拷贝到本工程中;
  • 创建客户端测试文件StatelessRemoteClient.java (带有main函数)
  • 在src目录下添加“jboss-ejb-client.properties”文件。
本地访问:
  • 使用通用JNDI API
  • 依赖注入:@EJB

4.无状态会话Bean的生命事件

  • 在无状态会话Bean中有两个重要的函数PostConstructPreDestroy
  • PostConstruct事件在组件对象生成的瞬间触发,通常用于对整个无状态会话Bean组件对象状态进行初始化。PreDestroy事件发生在组件对象将要被销毁的前一瞬间,通常用于释放组件对象使用过的资源。在整个EJB组件生命周期中,PostConstruct事件和PreDestroy事件只会被触发一次
PostConstruct事件

在无状态会话Bean组件对象创建过程中被触发,表示一个EJB组件对象的生成。通常EJB服务器创建EJB组件对象需要经过三个步骤:EJB容器首先调用EJB组件的Class.newInstance()方法生成一个组件对象;然后EJB组件服务器会将组件的XML配置文件或类似@Resource等标注所包含的初始信息,设置给刚生成的EJB组件对象;最后触发PostConstruct事件,以便进一步行组件自身状态的初始化

PreDsstory事件

它是EJB组件对象被销毁过程中的触发事件。在该事件的处理方法结束前,EJB组件对象仍旧是一个完整对象,同样可以进行各种操作和调用。该事件的处理方法结束后,EJB组件上的各种引用就被销毁,组件对象进入等待Java垃圾收集线程销毁过程。

5.无状态会话Bean生命周期


三种状态的介绍自己看ppt吧,我觉得知道这个转换就够了。

6.有状态会话Bean生命周期

PostConstruct事件

和无状态会话bean类似,但是ppt强调了 由于有状态会话Bean实例在构造过程中,系统会调用一个不带任何参数的构造方法,因而要求有状态会话Bean组件必须提供一个不带任何参数默认构造方法,否则组件对象在过程中会产生异常。

PreDestroy事件

和无状态会话Bean类似,对组件用过的资源进行释放

PrePassivate事件

当一个处于活动状态的有状态会话Bean对象长时间不使用时,EJB服务器通常会将该组件对象切换到休眠状态(钝化)。EJB组件休眠的本质是将EJB组件对象的状态当前环境状态统一保存起来,然后将对象从内存中删除。

PostActive事件

当有状态会话Bean对象由休眠状态切换到活动状态后,会马上触发EJB组件上的PostActive事件。在该方法中可以对EJB组件中的状态进行一些休眠后的恢复工作

7.有状态会话Bean和无状态会话Bean的区别

  • 组件对象进入休眠(缓存状态)的时刻
    有状态会话Bean进入休眠状态,通常是因为对应的组件对象长时间不被使用,或服务器负载十分重的情况下才会发生;而无状态会话Bean在一个方法执行完毕后就会被释放到实例池中。

  • 组件对象在休眠状态或缓存状态的差别
    无状态会话Bean进入缓存状态后,其对应的对象在服务器上还存在;而有状态会话Bean对象进入休眠状态后,其EJB组件对象被销毁,只是其对象状态被保存到了硬盘或数据库中。

  • 组件对象进入休眠或(缓存状态)时,EJB服务器所保留的组件数据
    无状态会话Bean组件对象进入缓存状态后,其被保留的是组件上下文环境;而有状态会话Bean组件对象进入休眠状态时被保存的不但是EJB组件的上下文环境,而且还包括EJB组件的各种属性状态。

8.单例会话Bean开发方法

  • 容器管理并发CMC:EJB容器控制客户端访问单例会话Bean的业务方法,其使用 @Lock 标注来指定当客户端调用方法是容器如何管理并发。@Lock的值可以为READWRITE
  • Bean管理并发BMC:需要使用 @ConcurrencyManagement(BEAN) ,并且利用Java编程语言的同步原语进行同步控制,例如synchronized和volatile。

9.单例会话Bean生命周期

与无状态会话Bean类似。

10.多接口会话Bean

一个会话Bean可以实现多个Remote型或者Local型接口,这类似于一个类实现了多个接口的情况。但不能在同一个接口上既使用@Remote,又使用@Local。

11.会话Bean异步调用

  • 默认情况下,通过远程接口、本地接口或无接口视图调用会话Bean是同步的通信方式:客户端调用一个方法,然后客户端被阻塞,直到被调用方法处理完成返回结果给客户端,客户端才能继续以下的工作。
  • 在EJB 3.1之前,异步调用只能通过JMSMDB来实现。在EJB 3.1规范中,你可以在一个会话Bean的方法上添加一个 @javax.ejb.Asynchronous标注来实现异步调用
  • 异步调用可以返回void也可以返回Future对象
  • Future对象允许在另外一个线程中执行的方法返回一个值,而客户端可以使用Future.get() 方法来获得结果, 使用Future.cancel() 方法终止调用。

以上是关于一篇博客带你拿下吉林大学JAVAEE期末(七:会话Bean)的主要内容,如果未能解决你的问题,请参考以下文章

一篇博客带你拿下吉林大学JAVAEE期末(七:会话Bean)

一篇博客带你拿下吉林大学JAVAEE期末

一篇博客带你拿下吉林大学JAVAEE期末

一篇博客带你拿下吉林大学JAVAEE期末

一篇博客带你拿下吉林大学JAVAEE期末

一篇博客带你拿下吉林大学JAVAEE期末(五:JNDI)