使用Tomcat对Spring IoC容器感到困惑

时间:2017-07-01 19:21:48

标签: spring tomcat

我开始使用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如何管理这种情况?

此致

3 个答案:

答案 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的引用返回   缓存的对象。