SeamFramework.orgCommunity Documentation
目前为止,我们看了大量使用注释来声明Web Bean的例子。然而,我们有时候并不使用注释来定义Web Bean,如下列情况:
当实现类是从先前已经存在的类库中产生的时候,或者
多个Web Bean对应同一个实现类的时候。
在上述任何一种情况下,Web Bean给我们两种选择:
写一个生产者方法,或者
使用XML来声明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
>
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模式。