在Spring中構建EJB組件


 
Spring 對於 EJB 的支持 <o:p></o:p>
Spring EJB 支持能夠粗略的分成兩類:訪問和實現。 Spring 中的訪問支持類使你能夠容易的訪問 EJB 資源。 Spring 提供了三種抽象類作為 EJB bean 類的基類,他們是: <o:p></o:p>
l         AbstractStatelessSessionBean<o:p></o:p>
l         AbstractStatefulSessionBean<o:p></o:p>
l         AbstractMessageDrivenBean<o:p></o:p>
當使用 Spring 來構建 EJB 的時候,必須提供所有不同的接口和 home 類,在 JCF 介紹一節中已經做過介紹。但是,當實現 bean 類的時候,就需要從合適的 Spring 基類繼承。 Spring 提供的基類允許 EJB 組件訪問 Spring ApplicationContext ,並且,這樣允許這些組件訪問 Spring 所管理的資源。 這有助於將業務邏輯從 EJB 實現中分離,寫到 EJB Spring 管理的 POJO 對象中。 <o:p></o:p>
Spring 提供的基類 AbstractEnterpriseBean 暴露了 beanFactoryLocator 屬性來允許子類訪問正在使用的實例 BeanFactoryLocator AbstractStatelessSessionBean 類已經實現了 ejbCreate() ejbActivate() ejbPassivate() 方法,而類 AbstractStatefulSessionBean 並沒有實現這些方法。 <o:p></o:p>
Spring 能夠從 ApplicationContext 中裝載所管理的資源, Spring 中的 EJB 基類的主要特征就是能夠訪問 ApplicationContext 來裝載資源。下面看看在系統的 SLSB 實例化的時候都做了些什么。 <o:p></o:p>
    public void setSessionContext(SessionContext ctx) { <o:p></o:p>
       super .setSessionContext(ctx); <o:p></o:p>
       setBeanFactoryLocator(ContextSingletonBeanFactoryLocator <o:p></o:p>
              .getInstance ( "classpath*:beanRefContext.xml" )); <o:p></o:p>
       setBeanFactoryLocatorKey( "applicationContext-main" ); <o:p></o:p>
    } <o:p></o:p>
SLSB 在第一次實例化的時候從 classpath 中加載 beanRefContext.xml 配置文件,生成一個 ContextSingletonBeanFactoryLocator ,再指明 BeanFactoryLocatorKey applicationContext-main 。如下面所示: <o:p></o:p>
< beans > <o:p></o:p>
  < bean name = "applicationContext-main" <o:p></o:p>
   class = "org.springframework.context.support.FileSystemXmlApplicationContext" > <o:p></o:p>
    < constructor-arg > <o:p></o:p>
      < list > <o:p></o:p>
        < value > etc/jcf/framework/config/applicationContext.xml value > <o:p></o:p>
        < value > etc/jcf/framework/config/applicationContext-dao.xml value > <o:p></o:p>
       < value > etc/jcf/framework/config/applicationContext-command.xml value > <o:p></o:p>
         < value > etc/jcf/framework/config/applicationContext-jms.xml value > <o:p></o:p>
       < value > etc/jcf/framework/config/applicationContext-service.xml value > <o:p></o:p>
      value > etc/jcf/framework/config/applicationContext-processor.xml value > <o:p></o:p>
      list > <o:p></o:p>
    constructor-arg > <o:p></o:p>
  bean > <o:p></o:p>
beans > <o:p></o:p>
                                        beanRefContext.xml<o:p></o:p>
<o:p> </o:p>
beanRefContext.xml 文件中指明了 Spring 所用到的配置文件在文件系統中的位置。      Spring 能夠從 ApplicationContext 中裝載所管理的資源的功能不是基類本身提供的,而是被委托給 BeanFactoryLocator 接口的實現,如下所示: <o:p></o:p>
abstract class AbstractEnterpriseBean implements EnterpriseBean {
       protected BeanFactory getBeanFactory() { <o:p></o:p>
       return this . beanFactoryReference .getFactory (); <o:p></o:p>
    }<o:p></o:p>
}<o:p></o:p>
                     BeanFactoryLocator 接口 <o:p></o:p>
<o:p> </o:p>
BeanFactoryLocator 並不直接返回 BeanFactory 實例;而是返回一個 BeanFactoryReference BeanFactoryReference 是一個輕量級 BeanFactory ApplicationContext 的包裝器,這個包裝器允許使用 BeanFactory 的資源平滑地釋放對 BeanFactory 的引用。缺省情況下,所有 EJB 基類使用了 BeanFactoryLocator 實現。本質上來說,這個類在一個給定 JNDI 地點上查找一個逗號分隔的配置文件列表,並且使用這些配置文件來創建 ClassPathXmlApplicationContext 的實例。三個基本 EJB 類都通過 AbstractEnterpriseBean 類表現出屬性 beanFactoryLocator ,通過設置這個屬性,就能夠提供你自己對於 BeanFactoryLocator 的不同實現。然而,如果你這樣做了,那么, bean 的每一個實例都有它自己的 ContextJndiBeanFactoryLocator 實例,同樣,每個 ContextJndiBeanFactoryLocator 的實例都有它自己的 ClassPathXmlApplicationContext 實例。 <o:p></o:p>
       雖然為你的 EJB 實例創建的所有 ApplicationContext 實例都用同樣的方式配置的,但是,所配置的 bean 是不一樣的。如果你的應用程序服務器創建 100EJB 個實例,那么,也創建了 100 ContextJndiBeanFactoryLocator 的實例,以及 100 ClassPathXmlApplicationContext 。如果應用程序不希望發生這種情況,那么 Spring 提供 SingletonBeanFactoryLocator ContextSingletonBeanFactoryLocator 類來分別裝載 BeanFactory ApplicationContext 的單件實例。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com