我正在构建客户端服务器应用程序的服务器部分,该服务器部分使用Web服务相互通信,并使用Apache CXF实现。
在应用程序中,我想要一个对象,该对象是在部署Web应用程序时创建的,并且在停止和/或取消部署之前一直存在。
我们称它为MyBackend backend
。
我还希望拥有不同的Web服务,例如http://myserver.com/service1
和http://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>