gpt4 book ai didi

java - Spring组件类必须是线程安全的

转载 作者:行者123 更新时间:2023-12-01 20:21:52 24 4
gpt4 key购买 nike

如果您使用 Spring,您的组件类(@Controller@Service@Repository)必须是线程安全的吗?或者 Spring 是否以线程安全的方式使用它们,因此您不必担心线程安全?

也就是说,如果我的 @Controller 中有一个 @RequestMapping 方法,是否可以由多个线程同时为同一 Controller 对象调用该方法?

(这有 sort-of been asked before ,但没有这样回答)。

最佳答案

给定

@Controller
public class MyController {
@RequestMapping(value = "/index")
public String respond() {
return "index";
}
}

Spring 将创建 MyController 的实例。这是因为 Spring 解析您的配置,<mvc:annotation-driven> ,参见@Controller (就像 @Component )并实例化带注释的类。因为它看到@RequestMapping它还会生成 HandlerMapping对于它,请参阅 docs here

任何 HTTP 请求 DispatcherServlet接收到的数据将通过 HandlerMapping 分派(dispatch)到此 Controller 实例之前注册过,调用respond()通过该实例的 java 反射。

如果您有类似的实例字段

@Controller
public class MyController {
private int count = 0;
@RequestMapping(value = "/index")
public String respond() {
count++;
return "index";
}
}

count这将是一个危险,因为它可能会被许多线程修改,并且对它的更改可能会丢失。

您需要了解 Servlet 容器的工作原理。容器实例化 Spring MVC 的一个实例 DispatcherServlet 。容器还管理一个线程池,用于响应连接,即。 HTTP 请求。当这样的请求到达时,容器从池中选择一个线程,并在该线程内执行 service() DispatcherServlet上的方法它将发送到正确的 @Controller Spring 为您注册的实例(根据您的配置)。

所以,是的,Spring MVC 类必须是线程安全的。您可以通过为类实例字段使用不同的作用域或仅使用局部变量来实现此目的。如果做不到这一点,您需要在代码中的关键部分添加适当的同步。

关于java - Spring组件类必须是线程安全的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58934066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com