JavaJersey:在主对象和Web服务之间共享数据的最佳方式是什么
假设我在grizzles服务器中有一个Jersey服务,我喜欢在服务器和服务实现之间共享数据(例如mydata)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
公共类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?
}
}