Java编程语言 EJB容器存取和实现说明
来源:优易学  2011-3-30 10:36:54   【优易学:中国教育考试门户网】   资料下载   IT书店

 

考虑这个例子:我们把无状态Session Bean的实现委托给普通的Java服务对象。 业务接口的定义如下:
  public interface MyComponent {
  public void myMethod(...);
  ...
  }
  这是简单Java对象实现方式的类:
  public class MyComponentImpl implements MyComponent {
  public String myMethod(...) {
  ...
  }
  ...
  }
  最后是无状态Session Bean自身:
  public class MyComponentEJB implements extends AbstractStatelessSessionBean
  implements MyComponent {
  MyComponent _myComp;
  /**
  * Obtain our POJO service object from the BeanFactory/ApplicationContext
  * @see org.springframework.ejb.support.AbstractStatelessSessionBean#onEjbCreate()
  */
  protected void onEjbCreate() throws CreateException {
  _myComp = (MyComponent) getBeanFactory().getBean(
  ServicesConstants.CONTEXT_MYCOMP_ID);
  }
  // for business method, delegate to POJO service impl.
  public String myMethod(...) {
  return _myComp.myMethod(...);
  }
  ...
  }
  Spring为支持EJB而提供的这些基类默认情况下会创建并载入一个BeanFactory (这个例子里,它是ApplicationContext的子类),作为其生命周期的一部分, 供EJB使用(比如像上面的代码那样用来获取POJO服务对象)。载入的工作是通过 一个策略对象完成的,它是BeanFactoryLocator的子类。 默认情况下,实际使用的BeanFactoryLocator的实现类是 ContextJndiBeanFactoryLocator,它根据一个JNDI环境变量 来创建一个ApplicationContext对象(这里是EJB类,路径是 java:comp/env/ejb/BeanFactoryPath)。如果需要改变 BeanFactory或ApplicationContext的载入策略,我们可以在子类中重定义了的 setSessionContext()方法或具体EJB子类的构造函数中调用 setBeanFactoryLocator()方法来改变默认使用的 BeanFactoryLocator实现类。具体细节请参考JavaDoc.
  如JavaDoc中所述,有状态Session Bean在其生命周期中可能会被钝化并重新激活, 如果是不可序列化的BeanFactory或ApplicationContext,由于它们不会被EJB容器保存, 所以还需要手动在ejbPassivate和ejbActivate 这两个方法中分别调用unloadBeanFactory()和loadBeanFactory, 才能在钝化或激活的时候卸载或载入。
  有些情况下,要载入ApplicationContext以使用EJB组件, ContextJndiBeanFactoryLocator的默认实现基本上足够了, 不过,当ApplicationContext需要载入多个bean,或这些bean初始化所需的时间或内存 很多的时候(例如Hibernate的SessionFactory的初始化),就有可能出问题,因为 每个EJB组件都有自己的副本。这种情况下,用户会想重载 ContextJndiBeanFactoryLocator的默认实现,并使用其它 BeanFactoryLocator的变体,例如ContextSingleton 或者BeanFactoryLocator,他们可以载入并共享一个 BeanFactory或ApplicationContext来为多个EJB组件或其它客户端所公用。这样做 相当简单,只需要给EJB添加类似于如下的代码:
  /**
  * Override default BeanFactoryLocator implementation
  *
  * @see javax.ejb.SessionBean#setSessionContext(javax.ejb.SessionContext)
  */
  public void setSessionContext(SessionContext sessionContext) {
  super.setSessionContext(sessionContext);
  setBeanFactoryLocator(ContextSingletonBeanFactoryLocator.getInstance());
  setBeanFactoryLocatorKey(ServicesConstants.PRIMARY_CONTEXT_ID);
  }

上一页  [1] [2] 

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训