Java Spring控制器是线程安全的吗

Java Spring控制器是线程安全的吗,java,spring,Java,Spring,我遇到了这个控制器示例,我想知道它是否是线程安全的?我特别想知道gson实例变量 import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import com.google.gson.Gson; impor

我遇到了这个控制器示例,我想知道它是否是线程安全的?我特别想知道gson实例变量

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.google.gson.Gson;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Controller
public class TestController {

    private final Gson gson = new Gson();

    @RequestMapping(value = "/test", method = RequestMethod.GET)
    public void test(HttpServletResponse res, HttpServletRequest req) throws IOException {
        HashMap<String, String> hm = new HashMap();
        res.getWriter().print(gson.toJson(results));
        res.getWriter().close();
    }
}
import org.springframework.stereotype.Controller;
导入org.springframework.web.bind.annotation.RequestMapping;
导入org.springframework.web.bind.annotation.RequestMethod;
导入com.google.gson.gson;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.HashMap;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
@控制器
公共类测试控制器{
私有最终Gson Gson=新Gson();
@RequestMapping(value=“/test”,method=RequestMethod.GET)
公共无效测试(HttpServletResponse res,HttpServletRequest req)引发IOException{
HashMap hm=新的HashMap();
res.getWriter().print(gson.toJson(results));
res.getWriter().close();
}
}

假设此控制器创建为一个普通的Spring“singleton”bean,答案是

您可以将控制器创建为bean,在这种情况下,将为每个请求创建一个新实例。如果您想这样做,更好的办法是将bean的范围定义为
request


然而,我质疑任何控制器对象都有成员变量的原因,除了错误地确定bean范围的可能性之外。这表明控制器正试图做太多的工作,其中一些工作应该转移到服务或助手类。MVC控制器应该做的唯一事情是将请求数据传递到服务层,并检索要由视图显示的数据。

Gson
绝对是线程安全的,早在2008年就这样做了,所以只要您的版本是post,那么就应该可以了。我发现你的代码没有线程安全问题。尽管我会将
Gson的实例设置为静态。

就像servlet一样,控制器请求处理程序方法也不是线程安全的。Ie对
/test
的多个请求可能会使多个线程执行测试方法


在您的示例中,您不必担心线程安全,因为
gson.toJson(results)
是gson上唯一的操作,似乎它不会改变该对象的状态。

要回答标题中的问题,“Spring控制器是否线程安全”,Spring控制器是单例,因此,它们应该以线程安全的方式实现,但由您来确保您的实现实际上是线程安全的


在您发布的代码中,您应该很好,因为正如其他人所指出的,GSON是线程安全的。

related@Boris-是否足够详细?我觉得在给出替代方案之前,阻止OP做一些愚蠢的事情是很重要的。OP清楚地表明,问题是关于GSON实例的线程安全性
我特别想知道GSON实例变量。
@Boris-好的。但我想知道为什么他/她没有想出像“Gson线程安全吗?”这样的标题?问问题很难,选择正确的标题很难。注意:使对象线程受限(更改作用域也不会自动使对象线程受限)并不会使其类线程安全。
Gson
可能是线程安全的,但将成员变量放入控制器是一个不好的习惯。但这要视情况而定,例如,您通常会看到像服务实现这样的东西被注入为成员变量。。。但是,如果使用Gson,我会将其作为一个原则专门设置为静态。避免使用成员变量就像骑三轮自行车害怕摔倒,而不是学习如何骑行和道路规则-你不会摔倒,但它不能给您错误的安全感。假设Servlet的所有线程安全规则,也适用于Spring控制器,理解正确吗?