我正在构建客户端服务器应用程序的服务器部分,该服务器部分使用Web服务相互通信,并使用Apache CXF实现。

在应用程序中,我想要一个对象,该对象是在部署Web应用程序时创建的,并且在停止和/或取消部署之前一直存在。

我们称它为MyBackend backend

我还希望拥有不同的Web服务,例如http://myserver.com/service1http://myserver.com/service2,其中


接收客户的请求,
将它们传递给backend对象,然后
MyBackend方法的返回值发送回客户端。


我计划创建以下两个类,它们使用MyBackend的相同实例。

@Path("/service1")
public class MyWebService1 {
    private MyBackend backend = ...;

    @POST
    @Produces("text/plain")
  public String performOperation1(@FormParam("request") final String aRequest)
  {
    return backend.doSomething();
  }
}


@Path("/service2")
public class MyWebService2 {
    private MyBackend backend = ...;

    @POST
    @Produces("text/plain")
  public String performOperation2(@FormParam("request") final String aRequest)
  {
    return backend.doSomethingDifferent();
  }
}


问题:


如果我以这种方式实现Web服务,MyBackend实例的状态是否会在不同的Web服务调用之间保留(如上所述),只要应用程序在app容器内运行,我就需要使该对象保持活动状态)?
我在哪里可以创建和初始化MyBackend实例(考虑到由于连接到数据库,初始化可能持续很长时间)?
后端对象的关闭过程应位于何处(例如断开与数据库的连接)?

最佳答案

我强烈建议使用Spring和依赖项注入来处理此问题。您可以定义一个MyBackend bean,然后将其注入到服务bean中。

<bean id="myBackend" class="com.whatever.MyBackend"/>

<bean id="service1Bean" class="com.whatever.MyWebService1">
  <property name="backend" ref="myBackend"/>
</bean>

<jaxrs:server id="service1" address="/">
  <jaxrs:serviceBeans>
    <ref bean="service1Bean" />
  </jaxrs:serviceBeans>
</jaxrs:server>

09-11 20:22