【问题标题】:In Spring REST, is the request object instantiated on each request?在 Spring REST 中,请求对象是否在每个请求上都实例化?
【发布时间】:2017-06-02 19:43:56
【问题描述】:

我很难找到一个可靠的答案。我知道控制器的作用域是单例并实例化一次,对于控制器类中的任何成员变量也是如此。

我的问题:传入的请求对象是每个请求的新实例吗?假设 Jackson 将 JSON 请求正文映射到请求对象。

例如:

@RequestMapping(path = "/dosomething", method = POST)
@ResponseBody
public SomeObject doSomething(@RequestBody SomeObject someObject) {
    // code here
    return someObject;
}

我想处理/存储或以其他方式更改 someObject 的状态,但不确定在处理许多请求时有多安全,或者我是否需要显式实例化从入站请求对象深度复制的新 SomeObject。

感谢您的帮助!

【问题讨论】:

  • 修改请求参数是安全的。但是,如果 Spring 是否会重用该实例,则不必担心(然而,这不太可能,因为池化开销比生成新值对象要大得多)。

标签: java spring-mvc jackson


【解决方案1】:

是的。传入 Spring 控制器的参数是每次调用的新实例。

与任何其他单例类类似,单例对象的实例会被重用,但不会将参数传递给方法(当然,除非您在多次调用单例时重用了该对象)。但是在控制器的情况下,参数每次都是从新的 HttpServletRequests 中创建的,因此没有重用实例的依据。

【讨论】:

  • 谢谢!这是有道理的,但我很难找到可以证实它的文档。听起来为了更好地理解,我可以查看 HttpServletRequest 文档。再次感谢,我真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
相关资源
最近更新 更多