SeamFramework.orgCommunity Documentation
到目前為止,我們已看過了許多透過使用標記來宣告的 Web Bean 了。不過,在某些情況下我們無法透過使用標記來定義 Web Bean:
當實做的 class 來自於一些現有的函式庫,或是
當相同的實做 class 應該要有多重 Web Bean。
在這兩種情況下,Web Bean 會提供我們兩個選項:
撰寫一個 producer method,或是
使用 XML 來宣告 Web Bean。
許多架構都使用 XML 來提供與 Java class 相關的 metadata。不過,Web Bean 使用了非常不同的方式來將 Java class 的名稱、欄位,或 method 指定給大部分其它的架構。與其將 class 和成員名稱編寫為 XML 要素和屬性的 string value,Web Bean 能讓您使用 class 或是成員名稱來作為 XML 要素的名稱。
這種作法的好處就是您可編寫一個防止您 XML 文件中有拼字錯誤的 XML schema。甚至有工具可藉由已編譯的 Java 程式碼來自動地產生該 XML schema。或是,某個整合的開發環境也能在不需要明確的居中產生步驟的情況下進行相同的驗證。
Web Bean 會針對於各個 Java 套件來定義相應的 XML namespace。這個 namespace 是藉由將 urn:java:
放置在 Java 套件名稱之前所形成的。com.mydomain.myapp
這個套件的 XML namespace 會是 urn:java:com.mydomain.myapp
。
屬於套件的 Java type 會被參照使用和該套件相應的 namespace 中的一個 XML 要素。該要素的名稱就是 Java type 的名稱。這個 type 的欄位和 method 會由相同 namespace 中的子要素所指定。若這個 type 為標記的話,成員則會由要素的屬性所指定。
比方說,下列這段 XML 中的 <util:Date/>
要素代表 java.util.Date
這個 class:
<WebBeans xmlns="urn:java:javax.webbeans"
xmlns:util="urn:java:java.util">
<util:Date/>
</WebBeans
>
並且這些為我們需要宣告的所有程式碼,Date
是個基本的 Web Bean!Date
的 instance 現在已能被任何其它 Web Bean 注入:
@Current Date date
我們能直接透過使用 Web Bean 宣告的子要素來宣告功能、建置類型以及攔截器綁定類型:
<myapp:ShoppingCart>
<SessionScoped/>
<myfwk:Transactional requiresNew="true"/>
<myfwk:Secure/>
</myapp:ShoppingCart
>
我們能使用完全相同的方式來指定名稱與綁定類型:
<util:Date>
<Named
>currentTime</Named>
</util:Date>
<util:Date>
<SessionScoped/>
<myapp:Login/>
<Named
>loginTime</Named>
</util:Date>
<util:Date>
<ApplicationScoped/>
<myapp:SystemStart/>
<Named
>systemStartTime</Named>
</util:Date
>
@Login
和 @SystemStart
為綁定標記類型(binding annotations type)。
@Current Date currentTime;
@Login Date loginTime;
@SystemStart Date systemStartTime;
就和平常一樣,Web Bean 可支援多重綁定類型:
<myapp:AsynchronousChequePaymentProcessor>
<myapp:PayByCheque/>
<myapp:Asynchronous/>
</myapp:AsynchronousChequePaymentProcessor
>
攔截器與裝飾器只是基本的 Web Bean,所以它們能像其它任何基本的 Web Bean 一樣地被宣告:
<myfwk:TransactionInterceptor>
<Interceptor/>
<myfwk:Transactional/>
</myfwk:TransactionInterceptor
>
Web Bean 允許我們於注入點定義一個 Web Bean。例如:
<myapp:System>
<ApplicationScoped/>
<myapp:admin>
<myapp:Name>
<myapp:firstname
>Gavin</myapp:firstname>
<myapp:lastname
>King</myapp:lastname>
<myapp:email
>gavin@hibernate.org</myapp:email>
</myapp:Name>
</myapp:admin>
</myapp:System
>
<Name>
這個要素能透過使用一組初始欄位值來宣告 @Dependent
這個 scope 以及 Name
class 的基本 Web Bean。
這項簡易卻強大的功能可允許 Web Bean XML 格式被使用來指定 Java 物件的整個 graph。它固然不是完整的 databinding 解決方案,不過卻也差得不遠!
若我們希望我們的 XML 文件格式能由 Java 開發人員以外的人員或是無法存取我們的程式碼的人員來進行編寫的話,我們將需要提供一個 schema。針對於 Web Bean,編寫或使用 schema 並無任何特殊情況。
<WebBeans xmlns="urn:java:javax.webbeans"
xmlns:myapp="urn:java:com.mydomain.myapp"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="urn:java:javax.webbeans http://java.sun.com/jee/web-beans-1.0.xsd
urn:java:com.mydomain.myapp http://mydomain.com/xsd/myapp-1.2.xsd">
<myapp:System>
...
</myapp:System>
</WebBeans
>
編寫 XML schema 非常地冗長。因此,Web Bean RI 專案將會提供一個能夠由已編譯的 Java 程式碼來自動產生 XML schema 的工具。