Jersey - 将UriInfo作为类实例变量注入并将其作为方法参数注入有什么区别?

时间:2014-10-16 15:21:35

标签: java jersey-2.0

我遇到了以两种方式注入UriInfo -

@Path("/users/")
public class UsersResource {

@Context
UriInfo uriInfo;

...

@GET
@Produces("application/json")
public JSONArray getUsersAsJsonArray() {
}

另一种方式是 -

@Path("/users/")
public class UsersResource {
...

@GET
@Produces("application/json")
public JSONArray getUsersAsJsonArray(@Context
UriInfo uriInfo) {

}

注入UriInfo的首选方法是什么?是否根据请求实例化了泽西岛资源或者它是Singleton?如果它是Singleton,那么使用第二种方法会不会很好?

1 个答案:

答案 0 :(得分:1)

Afaig,没有首选的注入UriInfo的方法。它或多或少取决于您工作或不工作的编程风格指南。当您在Jersey管理的组件中工作时,注入应该有效 我是一个,更喜欢现场注射变体。

请注意:您将注入的对象不是UriInfo本身,它是指向当前请求的UriInfo的代理。您可以将其描绘为容器/连接器的直接热线。

默认范围是Request Scoped

<小时/> Jersey用户指南中的Rules of Injection为我们提供了以下信息:

课程字段
将值直接注入类的字段。该字段可以是私有的,但不能是最终的。除了上面提到的可代理类型之外,不能在Singleton范围内使用。 Proxys包括:HttpHeadersRequestUriInfoSecurityContext ......

构造函数参数
将使用注入的值调用构造函数。如果存在更多构造函数,则将调用具有最多可注入参数的构造函数。除了上面提到的代理类型外,不能在Singleton范围内使用。

资源方法
资源方法(使用@GET,@ POST,...注释)可以包含在执行资源方法时可以注入的参数。可以在任何范围内使用。

子资源定位器
子资源定位器(使用@Path但不是@GET,@ POST,...注释的方法)可以包含在执行资源方法时可以注入的参数。可以在任何范围内使用。

制定方法
不是将值直接注入字段,而是可以将值注入setter方法,该方法将初始化字段。此注入只能与@Context注释一起使用。这意味着它不能用于例如注入查询参数,但它可以用于注入请求。 setter将在创建对象后调用,只调用一次。方法的名称不必具有setter模式。除了上面提到的可代理类型之外,不能在Singleton范围内使用。

<小时/> 希望这对你有所帮助......祝你有个美好的一天!