【问题标题】:Share an instance of a class across a JAX-WS or JAX-RS Webservice跨 JAX-WS 或 JAX-RS Web 服务共享类的实例
【发布时间】:2023-03-07 09:27:01
【问题描述】:

我已经建立了一个类(称为RecordManager)来管理文件系统上的数据。我想进行更改此类状态的 SOAP 或 REST 调用。但是,我只想为每次调用服务器运行此类的一个实例。

如何创建此类的一个实例并在所有 JAX-WS 或 JAX-RS 调用的情况下使用它?理想情况下,我只想打电话:

 @GET 
 public ... (...){
      rec_man.update( <parameters passed by call> )
 }

其中rec_manRecordManager 的实例

我相当肯定我已经确保了这个类的线程安全。

【问题讨论】:

  • 也许我没有理解正确,但听起来你希望 RecordManager 是静态的。这是一个可能重复的问题...stackoverflow.com/questions/5311331/…
  • 是的,这就是问题所在!我想知道如何措辞。但是我需要能够在java中做到这一点。你能指出我需要问的资源和措辞/问题吗?
  • 他们不是在问使用单例吗?

标签: java web-services jax-ws jax-rs


【解决方案1】:
public class RecordManager {
   public static final RecordManager INSTANCE = new RecordManager();
   private RecordManager() {
         // private constructor prevents instantiation
   }
}

您的 JAX-WS 服务或 JAX-RS 资源将像这样引用 RecordManager:

 @GET 
 public ... (...){
      ...
      rec_man = RecordManager.INSTANCE;
      rec_man.update( <parameters passed by call> )
 }

或者,如果您不喜欢这种风格(单例作为公共静态实例),您可以隐藏静态实例并公开静态方法来获取它。

public class RecordManager {
   private static RecordManager instance;
   private RecordManager() {
         // private constructor prevents instantiation
   }

   public static RecordManager getInstance() {
       if (instance == null) {
           instance = new RecordManager();
           ... init
       }
       return instance;
   }
}

你的用法变成:

 @GET 
 public ... (...){
      ...
      rec_man = RecordManager.getInstance();
      rec_man.update( <parameters passed by call> )
 }

请注意,如果您的实例化逻辑需要是线程安全的(例如,只永远初始化一次),那么您可以使用getInstance 方法synchronizedthis article 中描述的技术之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 2011-06-29
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多