为什么泽西岛导致单身人士班不起作用?

时间:2015-11-20 04:52:34

标签: java jersey singleton

我实现了这样的事情:

@Path("/svc")
public class Service {

    Resource rsc = Resource.getInstance();

    @GET
    public String doGet() {...}
}

public class Resource {

    public static Resource instance;

    private Resource() {...}

    public static getInstance(){
        if (instance == null){
            return new Resource();
        }
        return instance;
    }
}

Service class是实现GETPOST方法的地方,其中Resource是临时存储某些数据的单例类。

然而,当我测试它时,我发现每次调用一个方法时,单例类都会获得一个新实例。单例类只是一个经典的Java单例实现。我知道添加@Singleton注释可以解决问题,但我想知道导致这种行为的原因是什么?

3 个答案:

答案 0 :(得分:2)

简短回答

您的单身 不是单身

答案很长,如何解决

instance字段为public,您始终返回新的Resource个实例,而不是将其分配到instance字段。

还建议您将班级标记为final,并使用getInstance()方法中的同步:

public final class Resource {

    private static Resource instance;

    private Resource() {

    }

    public static synchronized Resource getInstance() {
        if (instance == null) {
            instance = new Resource();
        }
        return instance;
    }
}

然而,这不是实施单身人士的最佳方式

有关详细信息,请参阅What is an efficient way to implement a singleton pattern in Java?

答案 1 :(得分:1)

您没有为实例变量赋值。

public class Resource{
      private static Resource instance;

      private Resource(){...}

      public static getInstance(){
        if(instance == null){
    instance = new Resource();

        }
        return instance;
      }    
}

因此,当您尝试getInstance()资源文件时。它始终为null,这会导致为类

创建新对象

答案 2 :(得分:1)

JAX-WS Web服务本身就是一个Singleton。这意味着将使用单个Web服务实例(如Servlet)处理所有请求。 请参阅此链接,详细答案已在此Singleton Object in Java Web service

默认情况下,Jersey会为每个请求创建一个新的资源类实例。因此,如果您不注释Jersey资源类,它会隐式使用@RequestScoped范围。泽西岛文件中说明了这一点:

  

默认生命周期(在没有注释时应用)。在这   范围为每个新请求创建并使用资源实例   用于处理此请求。如果资源使用多个   在请求处理中的时间,将始终使用相同的实例。   当资源是更多的子资源返回时,可能会发生这种情况   匹配期间的时间。在这种情况下,只有实例会   服务请求。

相关问题