我开始使用Spring MVC开发REST API。 我将它部署在一个Tomcat容器中,它就像一个魅力。
由于Tomcat负责为每个请求创建一个新线程(如果我错了,请纠正我),我想知道Spring是如何处理这个来管理IoC(控制反转)容器的。
示例:我有以下服务
@Service
public class UserService{
private String username;
public setUsername(String username){
this.username = username;
}
public getUsername(){
return this.username;
}
}
因此,Spring基本上会创建这个单例并使其可供所有人使用。
如果请求到来并设置" foobar"用户名," getUsername"来自下一个请求的呼叫(来自不同的用户)返回" foobar" ? Spring如何管理这种情况?
此致
答案 0 :(得分:1)
与其他人提到的一样,默认情况下Spring会创建Singleton范围的bean,因此每个线程都会看到与其他线程相同的类级别状态。在这种情况下,最好的做法是避免在应用程序中维护类级别状态,并在方法范围内通过应用程序传递所有必需的数据,从而使它们具有线程安全性。
但是,如果你需要,你可以为每个线程创建新的bean实例。您可以使用@Scope(" prototype")注释您的bean,并且每个线程将获得一个bean实例。默认值为@Scope(" singleton")。如果您需要,可以使用其他几个范围。
答案 1 :(得分:0)
默认情况下,spring bean是singleton范围的,这意味着spring会创建bean的单个实例并为所有线程提供相同的实例。由于你的bean是有状态的(用户名),状态也将与所有线程共享,spring在那里没有任何魔法。 因此,如果一个线程设置用户名" xyz"然后第二个线程将其视为" xyz"。
答案 2 :(得分:0)
来自docs
只管理单个bean的一个共享实例,以及所有 对具有与该bean定义匹配的id或id的bean的请求 导致Spring返回一个特定的bean实例 容器
换句话说,当你定义一个bean定义时,它就是 作为单例,Spring IoC容器只创建一个 该bean定义定义的对象的实例。这个单身 实例存储在这种单例bean的缓存中,以及所有 后续请求和该命名bean的引用返回 缓存的对象。