我有一个无状态SOAP Web服务(Java, Spring, Tomcat)。
我想在每个会话中保留一些全局变量,以便于访问,避免使用静态变量,因为它们将具有容器作用域。
我该怎么做呢?如果唯一的方法是使用spring bean作用域,那么原型作用域和单例作用域哪个更好,为什么?
谢谢
Spring bean作用域可用于此。
会话范围的例子:
<bean id="customerService" class="com.customer.services.CustomerService"
scope="session"/>
(这不是对原始问题的回答,而是试图回答来自评论区的一些附加问题)
会话bean可以是无状态或有状态。如果它是无状态,它接受一个请求,发送一个响应(可能),然后被销毁。一个状态会话存储一些参数(一个状态),这些参数可以被其他方法调用重用——就像一个bean,它只是在内部计算它被调用的频率。
一个同步web服务可以用一个无状态会话bean实现。它接受一个请求,进行一些计算,返回一个响应,然后结束(bean可以被销毁)。在这种情况下,客户端等待答案,就像调用一个简单的Java方法。
这对于异步web服务是不同的:服务接收一个请求,并且
- 接收回调URL 或
- 响应一个会话ID
在任何情况下-客户端不会等待响应而是继续,直到它收到响应,或者因为
- 服务已将响应发送给客户端回调方法或
- 客户端使用会话ID轮询了几次,最终轮询了服务响应。
异步服务就像启动一个Java线程:你启动它,继续你的工作,在某个时候你得到结果(或者一个通知,结果已经准备好了)
当服务会话处于活动状态时,异步服务需要某种持久化存储来存储会话ID或回调URL 。服务会话是有状态的,服务所需的会话bean 可以是无状态的。