如何为不同的用户提供不同的 Autowired 模型

How to serve different Autowired model to different users

刚开始学习Spring。我对并发的一些简单概念感到困惑。

我有一个 class 只包含 1 个字段 uid:

@Service("Class1")
@Data
public class Class1 {
    private String uid;
}

而且我有请求映射器Class1 Autowired。

@RestController
@RequestMapping("/web")
@Scope("session")
public class Web {
    @Autowired
    Class1 class1;

    @GetMapping("/hello")
    public String sayHello(@RequestParam(value = "myName", defaultValue = "World") String name) {
        class1.setUid(name);
        try{
            Thread.sleep(5000);
        }
        catch (InterruptedException e){

        }
        return String.format("Hello %s and uid %s!", name,class1.getUid());
    }
}

现在,如果我使用两个不同的参数(例如 myName=name1myName=name2 同时命中两个请求,两个请求中的 uid 将显示相同。但我认为它应该等于正在传递的特定名称。

我想分配 uid 等于传递的名称。两个请求中怎么不能有 2 个不同的 Class1 实例?为什么会出现这种并发?

我知道 Spring 通过生成 2 个不同的线程来处理 2 个不同的会话。但我担心的是两个线程都使用相同的 bean。但我想要不同的会话的不同实例。这样做的正确方法是什么?

我不确定这是否是问题所在,但乍一看我可以将此与默认(隐式使用)范围是 Singleton 的事实联系起来,这意味着只有一个 bean 实例(在您的案例服务bean)。通常,要处理 bean 内部的状态,最好对服务使用 @RequestScope class(如果你想在那里存储状态),这将为每个特定请求创建 bean 实例。

不确定,但您在 class 级别使用 @Service,因此它在所有会话之间共享。所以最终的结果取决于后面服务哪个请求。 所以

R1 -> "string1"
R2 -> "string2"

你打电话的时候

return String.format("Hello %s and uid %s!", name,class1.getUid());

它将获取设置的最新值

根据我的理解,数据 class 不应该是共享组件(@Component 或其衍生物),因为默认范围是单例,您需要更改范围(原型或其他)。以便在每次请求时实例化它以获取更多详细信息,您可以阅读 https://www.geeksforgeeks.org/singleton-and-prototype-bean-scopes-in-java-spring.