本文素材来自网络,总结了一下,以备查询。

1.Stateful session Bean (有状态会话Bean)
有状态会话Bean实例有三种状态,不存在,就绪,和钝化。
客户端调用home接口的create 方法,ejb容器实例化一个Bean并调用setSesssionContext,ejbCreate方法,使得Bean处于就绪状态。然后客户就可以使用其商业方法了。ejb容器对Bean的生命周期进行管理,一般会对最少使用的EJB进行钝化,当客户在使用这个EJB时,容器会进行激活,这个过程对客户来说是透明的。当用户调用remove方法,容器调用ejbRemove方法,ejb生命周期结束.

2.Stateless Session Bean(无状态会话Bean)
实例就两种状态,不存在和就绪.
客户端调用home接口的create方法,如果不存在可用的实例.ejb容器实例化一个Bean并调用setSesssionContext,ejbCreate方法.当客户调用remove方法之后,ejb容器则调用ejbRemove的方法,ejb生命周期结束.

以上两种Bean的区别: 

无状态ejb一但创建就保留在容器内 ,供所有的客户端调用,所有的客户共用一个对象的。而有状态ejb,当第一个用户

调用有状态ejb的时候,容器创建一个对象,供该用户使用,第二个用户再调用有状 态ejb的时候,容器再创建一个对象,攻第二个用户使用,每个用户都有自己对应的 ejb端的对象,当客户端调用本地接口对象的remove方法的时候,它对应容器中的ej b对象就会调用它的ejbRemove方法,这个时候生命周期结束,也就是说有状态ejb是通过客户断调用remove来结束该对象的生命,而无状态是不可以的,他必须等到服务器发出关闭指令才结束生命,当然也可以通过手工在容器上删除,是不可以通过客户端来结束它的生命的。。。
      电子商城的公布信息对所有的用户都是相同的,那么我们应该用无状态ejb
      电子商城的用户的购物车对每个用户都是不同的,那么必须要用有状态ejb
  
3.Entity Bean(实体bean)
实体bean有三种状态,不存在,在pool中,就绪.
ejb容器创建实例时调用setEntityContext,把容器的上下文传到bean组件中.实例化之后bean会移到池中,此时ejb没有和任何的实体对象进行关联,所有的bean实例是一样,容器会指派它和具体的实体标示关联,进入就绪状态。有两种方法使得一个实体bean从池化进入到就绪状态,一是客户端使用create方法,使得ejb容器调用ejbCreate和ejbPostCreate 方法,二是容器调用ejbActivate方法,这对客户来说是透明的,只有当实体bean处于就绪状态时,才能调用其商业方法。同样如果实体bean要从就绪进行池化也有两种方法,一是客户端调用remove方法,容器调用ejbRemove;二是容器ejbPassivate方法。bmp和cmp,在bean实例从池化到就绪时,对于bmp的实体bean,容器不会自动设置primary key.因此ejbCreate and ejbActivate 需要获得这个primary key ,如果这个key非法,ejbLoad and ejbStore methods 不能同步实体变量到数据库。ejbCreate 通过参数传入,ejbActivate 通过id = (String)context.getPrimaryKey();在pool状态,这些需要持久化的实体变量则不需要,在ejbPasssivate 中把它赋值null。unsetEntityContext,bean生命周期结束的时候调用。

4.Message Driven Bean(消息驱动Bean)
消息bean就两种状态:不存在和就绪.
就像stateless session bean,容器在实例化bean的时候,调用setMessageDrivenContext,ebjCreate. 调用ejbRemove方法结束生命周期。当消息到达的时候Onmessage方法。因此可以mdb是一种jms客户端企业级组件。

 

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐