我实现了这样的事情:
@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是实现GET
和POST
方法的地方,其中Resource
是临时存储某些数据的单例类。
然而,当我测试它时,我发现每次调用一个方法时,单例类都会获得一个新实例。单例类只是一个经典的Java单例实现。我知道添加@Singleton
注释可以解决问题,但我想知道导致这种行为的原因是什么?
答案 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范围。泽西岛文件中说明了这一点:
默认生命周期(在没有注释时应用)。在这 范围为每个新请求创建并使用资源实例 用于处理此请求。如果资源使用多个 在请求处理中的时间,将始终使用相同的实例。 当资源是更多的子资源返回时,可能会发生这种情况 匹配期间的时间。在这种情况下,只有实例会 服务请求。