对于Spring,如果我有两个同时访问单例bean的请求怎么办?一个请求是否必须等到另一个请求完成。 Spring容器如何为我的请求找到单例bean实例?
对于servlet,如果我有两个请求同时访问普通类的普通方法(没有静态没有其他复杂的东西)?一个请求是否必须等到另一个请求完成以避免并发(同时两个请求正在尝试访问同一类的对象)。 Web容器如何为我的请求找到实例?
答案 0 :(得分:14)
对于Spring,如果我有两个访问singleton bean的请求怎么办? 同时?一个请求是否必须等到另一个请求 完成?
Spring容器为单例bean类创建一个且只有一个实例(比如Controller,Service类等)。 在Java中,有几种方法可以安全地为类创建单例实例,您可以查看here以获取更多信息。一旦Spring容器创建了单例实例,那么将使用控制器/服务类的单个实例来提供Web请求。
此外,没有问题(即,两者之间不会有任何等待),即使两个请求访问单例bean,因为它们将在两个单独的线程中提供,所有你需要确保的是你的控制器和服务类(即单例范围的bean)不携带/保持任何状态(即,它们是无状态的)并且是线程安全的。
Spring容器如何找到我的单例bean实例 请求?
Spring容器根据您使用xml或通过注释提供的配置创建然后注入单例bean实例。
对于servlet,如果我有两个访问普通类的请求 正常方法(没有静态没有其他复杂的东西)同时? 一个请求是否必须等到另一个请求完成以避免 并发(同时两个请求试图访问 同类的对象)?
不,每个请求都将在一个单独的线程中处理,因此一个请求不会等待另一个请求被提供/完成,换句话说,请求将被并行提供/处理。这是通过使用/管理线程池来实现Web容器的。
Web容器如何查找我的请求的实例?
Web容器(如Tomcat等)创建并加载所有servlet类(如Spring' s DispatcherServlet
或您自己的自定义servlet)然后一次Web请求来自客户端(如浏览器),它将根据web.xml中配置的url-pattern
或通过注释处理到servlet。