如何为不同的用户提供不同的 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=name1
和 myName=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.
刚开始学习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=name1
和 myName=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.