JavaJersey:在主对象和Web服务之间共享数据的最佳方式是什么

JavaJersey:在主对象和Web服务之间共享数据的最佳方式是什么,java,jersey,Java,Jersey,假设我在grizzles服务器中有一个Jersey服务,我喜欢在服务器和服务实现之间共享数据(例如mydata) 公共类MyServer { 字符串mydata=“”; 公共静态void main(字符串[]args) { ResourceConfig rc=new ResourceConfig().packages(MyServer.class.getPackage().getName()); HttpServer hs=GrizzlyHttpServerFactory.createHtt

假设我在grizzles服务器中有一个Jersey服务,我喜欢在服务器和服务实现之间共享数据(例如mydata)

公共类MyServer
{  
字符串mydata=“”;
公共静态void main(字符串[]args)
{
ResourceConfig rc=new ResourceConfig().packages(MyServer.class.getPackage().getName());
HttpServer hs=GrizzlyHttpServerFactory.createHttpServer(URI.create(“http://localhost/myserver"(rc),;
对于(int i=0;i<10;i++)
{
mydata+=“bla”;
}
hs.shutdown();
}
}
@路径(“myservice”)
公共类MyService
{
@得到
公共字符串getIt()
{
//如何访问mydata?
}
}
共享这些数据的最佳方式是什么? 我可以想到一个单例或使我的数据是静态的。但也许有一种我在这里看不到的标准方式


谢谢

当且仅当
mydata
确实是静态的且不能由多个线程更改时(例如,在服务的
getIt()
方法中),您可以使
mydata
成为singleton的静态或实例变量

这种技术通常应用于和使用公共配置属性

一般来说,这是这种情况的标准方式。顺便说一句,您可以在服务器类中保留您的
mydata
而不是必需的,但是可以创建另一个类来保存这些公共数据(如果有很多),但这是一个选择问题

另外,更标准的做法是不公开实际的
mydata
字段,而是为其提供getter/setter对

最后,如果这种公共/静态值可以由多个线程更改,则需要使其同步以避免并发修改

有更多不同的方法来处理并发性并使代码线程安全,但这属于您的实际需要。无论如何,它们最终都是静态/单例同步实现


注意,如果这是一个常见的静态数据,您必须在启动服务器之前而不是之后(如您的示例中)填充它,否则请求可能会在数据准备好供服务线程使用之前到达。

我已经发现这也是关于线程/并发的。但是我正在寻找一种方法来提供对服务器内部数据的引用。因为我可以在线程构造函数中引用对象。但如果这是不可能的,我需要使用静力学。我没有得到你想要的。在Java中,所有内容都是对对象甚至类及其静态成员的引用。(只有原语在方法调用中传递值)。主要的问题是,当需要引用时,该对象实际存在于何处。您可以使用依赖项注入。
public class MyServer 
{  
    String mydata="";

    public static void main (String [] args)
    {
        ResourceConfig rc = new ResourceConfig ().packages (MyServer.class.getPackage ().getName ());
        HttpServer hs = GrizzlyHttpServerFactory.createHttpServer (URI.create ("http://localhost/myserver"), rc);

        for (int i = 0; i < 10; i ++)
        {
             mydata += "bla";
        }

        hs.shutdown ();
    }
}



@Path ("myservice")
public class MyService 
{
        @GET
        public String getIt() 
        {
            // how to access mydata?
        }
}