spring 如何同时为单例豆提供多个请求

2022-09-03 13:09:08

对于Spring,如果我有两个同时访问单例bean的请求怎么办?一个请求是否必须等到另一个请求完成。Spring 容器如何为我的请求查找单例 Bean 实例?

对于 servlet,如果我有两个请求同时访问普通类的正常方法(没有静态没有其他复杂的东西)?一个请求是否必须等到另一个请求完成才能避免并发(同时两个请求正在尝试访问同一类的对象)。Web 容器如何为我的请求查找实例?


答案 1

对于Spring,如果我有两个同时访问单例bean的请求怎么办?一个请求是否必须等到另一个请求完成?

Spring 容器为单例 Bean 类创建一个且只有一个实例(如控制器、服务类等)。在Java中,有几种方法可以安全地为类创建单例实例,您可以在此处查找有关此内容的更多信息。一旦Spring容器创建了单一实例,那么Web请求将使用控制器/服务类的单个实例提供服务。

此外,即使两个请求访问单例 Bean,也没有问题(即,中间不会有任何等待),因为它们将在两个单独的线程中提供,并且您需要确保控制器和服务类(即,单例作用域 Bean)不携带/保持任何状态(即,它们是无状态的)并且是线程安全的

Spring 容器如何为我的请求查找单例 Bean 实例?

Spring 容器根据您使用 xml 或通过注释提供的配置创建并注入单例 Bean 实例。

对于 servlet,如果我有两个请求同时访问普通类的正常方法(没有静态没有其他复杂的东西)?一个请求是否必须等到另一个请求完成才能避免并发(同时两个请求正在尝试访问同一类的对象)?

不,每个请求将在单独的线程中处理,因此一个请求不会等待另一个请求被送达/完成,换句话说,请求将被并行处理/处理。这是由 Web 容器通过使用/管理线程池来实现的。

Web 容器如何为我的请求查找实例?

Web容器(如Tomcat等)创建并加载所有servlet类(如Spring或您自己的自定义servlet),然后一旦Web请求来自客户端(如浏览器),它将根据Web中的配置或通过注释将其处理到servlet.xml。DispatcherServleturl-pattern


答案 2

推荐