SeamFramework.orgCommunity Documentation

第 12 章 使用XML定义Web Bean

12.1. 声明Web Bean类
12.2. 声明Web Bean的元数据
12.3. 声明Web Bean成员
12.4. 声明内联的Web Beans
12.5. 使用一个模式

目前为止,我们看了大量使用注释来声明Web Bean的例子。然而,我们有时候并不使用注释来定义Web Bean,如下列情况:

在上述任何一种情况下,Web Bean给我们两种选择:

很多框架使用XML来提供Java类相关的元数据。然而,Web Bean使用了和大多其他框架不同的方法来指定Java类的名字,域或者方法。Web Bean让你使用类或者成员名作为XML元素名,而不是将类和成员名作为XML元素的字符串值来声明Web Bean。

这种方法的好处是你可以使用XML模式来验证XML, 阻止XML文档中的拼写错误。它甚至可以让一个工具从编译好的Java代码中自动生成XML模式。或者一个整合开发环境(IDE)可以直接进行验证,无需使用显式的中间生成步骤。

对于每个Java包,Web Bean定义了一个对应的XML名域空间。这个名域由 urn:java:前缀加上Java包名组成。对于 com.mydomain.myapp 包来说,对应的XML名域是 urn:java:com.mydomain.myapp

属于一个包的Java类型指的是在对应这个包的名域中使用一个XML元素。元素的名字就是Java类型的名字。类型的域和方法通过相同的名域下的子元素定义。如果类型是一个注释的话,其成员通过这个元素的属性指定。

例如, 在下面的XML片段中的元素<util:Date/>指的是 java.util.Date 类:


<WebBeans xmlns="urn:java:javax.webbeans"
          xmlns:util="urn:java:java.util">

    <util:Date/>

</WebBeans
>

这个是将Date 声明为一个简单web Bean所需的所有代码!现在任何一个 Date 实例都可以被任何其他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 是绑定注释类型。

@Current Date currentTime;

@Login Date loginTime;
@SystemStart Date systemStartTime;

通常,一个Web Bean可以支持多个绑定类型:


<myapp:AsynchronousChequePaymentProcessor>
    <myapp:PayByCheque/>
    <myapp:Asynchronous/>
</myapp:AsynchronousChequePaymentProcessor
>

拦截器和装饰器只不过是简单的Web Beans,所以它们可以像其他简单Web Bean一样被声明:


<myfwk:TransactionInterceptor>
    <Interceptor/>
    <myfwk:Transactional/>
</myfwk:TransactionInterceptor
>

TODO!

Web Beans让我们能够在一个注入点定义一个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 ,类为 Name 的一个简单的Web Bean,并且设置了一套初始的域值。这个Web Bean有一个特殊的,容器生成的绑定,因此只能在它声明的特定注入点被注入。

这个简单但是很强大的特性能够让我们使用Web Bean XML配置格式来指定整个Java类的图。这并不是完整的数据绑定方案,但是它很接近了!

如果我们希望我们的XML文档格式由非Java开发者或者没有权限访问我们代码的人来制定,我们需要提供一个模式。在Web Beans中使用模式没有什么特殊的地方。


<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模式相当繁琐。因此,Web Bean的参考实现项目提供了一个工具,可以从编译好的Java代码中自动化生成XML模式。