JAX-RS:getClasses vs getSingletons

时间:2013-08-15 14:12:08

标签: web-services web-applications jersey jax-rs

我正在使用JAX-RS(Jersey实现)来构建Web服务。

Web应用程序的入口点是一个扩展Application并覆盖getClasses方法的类。据我所知,JAX-RS将为每个新请求创建一个新实例。

可以改写getSingleton。我的理解是,这将为所有请求重用相同的实例。但是,这种方法(假设我是正确的)不会破坏Web应用程序中的并发性吗?也就是说,由于始终使用相同的实例,因此将一次处理一个传入请求(FIFO?)。

1 个答案:

答案 0 :(得分:16)

不,它不会。 JVM中的多个线程能够同时访问一个类的一个实例(在这种情况下,在您的资源上调用资源方法)。您只需要确保您的资源是线程安全的。

为了说明getClasses()getSingletons()之间的差异,我们假设我们有一个HelloWorldResource

@Path("helloworld")
public class HelloWorldResource {

    private volatile int counter = 0;

    @GET
    @Produces("text/plain")
    public String getHello() {
        return "Hello World! " + counter++;
    }

}

多次调用getHello资源方法会返回:

  • 如果您通过getClasses

    注册资源
    Hello World! 0
    Hello World! 0
    Hello World! 0
    ...
    
  • 如果您使用getSingletons注册资源

    Hello World! 0
    Hello World! 1
    Hello World! 2
    ...