- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果您使用 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/
我是一名优秀的程序员,十分优秀!