SeamFramework.orgCommunity Documentation

附錄 A. 將 Web Bean RI 整合入其它環境中

目前,Web Bean RI 只能在 JBoss AS 5 中執行;要將 RI 整合入其它 EE 環境中(比方說另一個像是 Glassfish 的應用程式伺服器)、整合入一個 servlet 容器(例如 Tomcat)中,或是和一個崁入式的 EJB3.1 實做整合都是相當容易的。在此附錄中,我們將簡略地討論所需的步驟。

您可在一個 SE 環境下執行 Web Bean,不過您必須進行較多步驟,包括新增您自己的 context 和生命週期。Web Bean RI 目前並不會顯示生命週期的延伸點,因此您必須針對於 Web Bean RI 的 class 來直接地進行程式撰寫。

Web Bean SPI 位於 webbeans-ri-spi 模組中,並且被封裝為 webbeans-ri-spi.jar。有些 SPI 為可選的,若您需要置換預設的特性,您則需要其它 SPI。

您可將一個 SPI 的實做作為系統內容來指定,或是在內容檔案 META-INF/web-beans-ri.properties 中來指定。所有內容名稱皆為已實做介面的完整類別(class)名稱,並且所有內容值皆為已實做類別的完整類別名稱。

SPI 中所有的介面都支援裝飾器模式並提供了一個 Forwarding class。

Web Bean RI 也會委派 EJB3 bean discovery 至 container,因此它便無須掃描 EJB3 記號或剖析 ejb-jar.xml。針對於應用程式中的各個 EJB 都應該能發現一個 EJBDescriptor:

public interface EjbDiscovery

{
   public static final String PROPERTY_NAME = EjbDiscovery.class.getName();
   
   /**
    * Gets a descriptor for each EJB in the application
    * 
    * @return The bean class to descriptor map 
    */
   public Iterable<EjbDescriptor<?>
> discoverEjbs();
   
}
public interface EjbDescriptor<T

> {
   
   /**
    * Gets the EJB type
    * 
    * @return The EJB Bean class
    */
   public Class<T
> getType();
   /**
    * Gets the local business interfaces of the EJB
    * 
    * @return An iterator over the local business interfaces
    */
   public Iterable<BusinessInterfaceDescriptor<?>
> getLocalBusinessInterfaces();
   
   /**
    * Gets the remote business interfaces of the EJB
    * 
    * @return An iterator over the remote business interfaces
    */
   public Iterable<BusinessInterfaceDescriptor<?>
> getRemoteBusinessInterfaces();
   
   /**
    * Get the remove methods of the EJB
    * 
    * @return An iterator over the remove methods
    */
   public Iterable<Method
> getRemoveMethods();
   /**
    * Indicates if the bean is stateless
    * 
    * @return True if stateless, false otherwise
    */
   public boolean isStateless();
   /**
    * Indicates if the bean is a EJB 3.1 Singleton
    * 
    * @return True if the bean is a singleton, false otherwise
    */
   public boolean isSingleton();
   /**
    * Indicates if the EJB is stateful
    * 
    * @return True if the bean is stateful, false otherwise
    */
   public boolean isStateful();
   /**
    * Indicates if the EJB is and MDB
    * 
    * @return True if the bean is an MDB, false otherwise
    */
   public boolean isMessageDriven();
   /**
    * Gets the EJB name
    * 
    * @return The name
    */
   public String getEjbName();
   
   
}

EjbDescriptor 本身已不解自明並且不需加以說明,它應會依照 EJB 規格中所定義地來回傳相關的 metadata。除了這兩個介面,還有個代表本地商業介面的 BusinessInterfaceDescriptor(包含了使用來查詢某個 EJB instance 的 interface class 以及 jndi 名稱)。

Web Beans RI 可被指定來透過使用 org.jboss.webbeans.bootstrap.spi.EjbDiscovery 以及完整的 class 名稱為值來載入您 EjbDiscovery 的實做。例如:

org.jboss.webbeans.bootstrap.spi.EjbDiscovery=org.jboss.webbeans.integration.jbossas.EjbDiscoveryImpl

若 Web Bean RI 被使用在一個 servlet container 中的話,它會預期一個含有下列格式的 constructor:

public EjbDiscoveryImpl(ServletContext servletContext) {}

servlet 的 context 可被用來允許您 EjbDiscovery 的實做來與 container 進行互動。

Web Bean RI 對於 container 有些需求以便達到 API 實做之外的正確的功能。