Apache Wink REST 开发中的高级主题(1)简介
 
- UID
- 1066743
|

Apache Wink REST 开发中的高级主题(1)简介
注释!在 JAX-RS 中,注释是将传入的 HTTP 请求信息注入 Java™ 方法的主要机制之一。作为一个遵从 JAX-RS 的框架,Apache Wink 根据规范实现需要的注释,但是它还提供了很多非标准的注释,比如 @Asset 注释和 @Scope 注释。
@Asset 注释@asset 注释是一个标记,将 Java 类标识为资产。资产 是资源方法返回的特殊形式的实体对象。Apache Wink 运行时还可以将资产以参数的形式注入资源方法中。资产是一个数据模型容器对象,为各种内容类型提供转换方法。资产可用于在资源和提供者之间传递信息,有助于减少在 Apache Wink 系统中注册的提供者数量。这一点非常重要,提供者过多会导致 Wink 系统的系统性能降低。
演示 @asset 注释的用法。Transaction bean 是一个 Java Architecture for XML Binding (JAXB) class.TransactionAsset 类。TransactionAsset 类包装 Transaction bean 的一个实例,如下所示。
清单 1. TransactionAsset 类1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| @Asset
public class TransactionAsset {
public Transaction transaction;
public TransactionAsset(Transaction transaction) {
this.transaction = transaction;
}
@Produces("application/xml")
public Transaction getTransaction() {
return this.transaction;
}
@Consumes("application/xml")
public void setTransaction(Transaction transaction) {
this.transaction = transaction;
}
}
|
该资产类可作为响应由资源方法返回,也可以参数的形式被传递。Apache Wink 运行时通过调用资产类对应的方法构建实际的响应实体。
@Scope 注释根据 JAX-RS 规范,默认情况下,提供者和资源类为每个 JAX-RS 应用程序实例化一次。这种实例化涉及到要调用的类的默认构造函数,随后还要注入依赖关系。
在对象的生命周期期间,在将提供者和资源对象中的相应方法作为垃圾回收之前,可对其进行多次调用。Apache Wink 通过 @Scope 注释为提供者和资源提供其他生命周期。 展示了如何使用原型(每个请求)生命周期定义资源。
清单 2. @Scope 示例1
2
3
4
5
| @Scope(ScopeType.PROTOTYPE)
@Path("helloworld")
public class HelloWorldResource {
...
}
|
在原型生命周期中,Apache Wink 运行时为每个传入请求实例化一个新的对象。尽管这种行为从内存/性能角度看可能不太理想,但您无需再担心资源和提供者类中的线程和并发问题。
@Parent 注释本系列的 详细介绍了 @Path 注释,并指出 JAX-RS 使用它为传入请求定义 URI 匹配模式。通常将其置于 Java 类或方法。
@Parent 注释与 @Path 注释有 “紧密” 的联系,它为资源中指定的内容提供基本 URI。如果 Apache Wink 运行时在资源中遇到 @Parent 注释,那么它将尝试计算最终的资源 URI 模板:首先计算包含父资源类 URI 的 @Parent 注释的值,之后尝试连接资源路径 URI 和父资源的 URI。 提供了一个 @Parent 注释的示例。
清单 3. @Parent 示例1
2
3
4
5
6
7
8
9
10
| @Path("parentservice")
public class ParentResource {
...
}
@Parent(ParentResource.class)
@Path("childservice")
public class ChildResource {
...
}
|
在本例中,有两个资源:ParentResource 和 ChildResource。ParentResource 将 @Path 注释定义为 parentservice URI。ChildResource 将 @Path 注释定义为 childservice URI。ChildResource 还使用 @Parent 注释将 ParentResource 定义为父资源。在本例中,Apache Wink 运行时将 ChildResource 的最终 URI 变为 parentservice/childservice。 |
|
|
|
|
|