【发布时间】:2015-07-14 22:28:10
【问题描述】:
我有这样的事情:
@Controller
@Scope("session")
public class MyServletController {
@Autowired
private QueryRunner queryRunner;
HashMap<String, Result> resultsMap;
@RequestMapping("/submitQuery")
public ModelAndView submitQuery(HttpServletRequest request)
{
String sessionId = request.getParameter("sessionId");
Result r = queryRunner.runQuery(sessionId, request.getParameter("otherdata"));
resultsMap.put(sessionId, r);
}
@RequestMapping("/getResult")
@ResponseBody
public void saveTextLinks(HttpServletRequest request,
HttpServletResponse response) throws IOException
{
String sessionId = request.getParameter("sessionId");
//return sessionId result from resultsMap
}
}
<bean id="queryRunner"
class="com.myproject.QueryRunner"
scope="prototype">
<aop:scoped-proxy />
<property name="errorMessageA" value="${error.messagea}"></property>
<property name="errorMessageB" value="${error.messageb}"></property>
</bean>
我想要的是 Servlet 控制器是会话范围的,但是每个请求都需要实例化一个新的 QueryRunner 以便在一次发送多个请求时不会有任何干扰。
如何配置 Spring 来执行此操作?
诱人的解决方案就是去:
@RequestMapping("/submitQuery")
public ModelAndView submitQuery(HttpServletRequest request)
{
queryRunner = new QueryRunner(); //<-----
String sessionId = request.getParameter("sessionId");
Result r = queryRunner.runQuery(sessionId, request.getParameter("otherdata"));
resultsMap.put(sessionId, r);
}
【问题讨论】:
-
您目前拥有的有什么问题?
scope="request"可能更合适,但除非您在其他代码中也使用QueryRunner,否则它是无用的。 -
@SotiriosDelimanolis scope=request 不适合,因为控制器需要为以后的查询保存数据。将编辑显示。
-
queryRunnerbean 的请求范围不是@Controllerbean。 -
@SotiriosDelimanolis 现在看看这个。这是如何工作的,因为
QueryRunner不是 Servlet 控制器 - 它只是普通的 java 类。 Spring 是如何知道实例化它的? -
这是一个广泛的主题。简而言之:它使用反射。
标签: java spring instantiation