java - 多线程环境中的 Spring Singleton 行为

标签 java spring

我是 Spring 的新手。阅读 documentation我发现里面提到了

Bean default scope is a singleton.

如果容器中只有一个实例,则“它在多线程环境中的行为方式”。

通常在任何 Web 应用程序中,都会同时执行多个请求,如果 POJO 类是 Autowiring 的并且同时执行多个请求,则 getter 和 setter 将相互交叉数据。请求 1 设置数据,同时请求 2 覆盖。请求 1 获取请求 2 覆盖的数据。

像 Foo 一样,它是一个 POJO 类,其 get 和 set 不同步。

 @Service
    public class Foo {
        String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

   

     @Autowired
        private Foo foo;
    
        @RequestMapping(value = "foo" , method = RequestMethod.POST )
        public String saveFoo(@RequestBody String fooname){
            foo.setName(fooname);  // In case of multiple request 
                                  //get and set will be happing on same instance could be wrong
            return foo.getName();
        }

在多线程环境中处理 Autowire 和 POJO 的理想方法是什么?开发人员是否必须提及原型(prototype)范围?

最佳答案

一般来说,服务对象应该是无状态的。您的问题是您将数据直接存储在 Foo 中,这不是它所属的位置。对服务的调用应在方法签名中包含所有必要的参数;持久对象应该保存在某个地方(例如数据库)并通过键引用(可能保存在 HTTP session 中或作为请求参数发送)。

关于java - 多线程环境中的 Spring Singleton 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66445082/

相关文章:

Spring Data Rest 发布到收集端点

java - 是否有任何 Spring Boot 文档来了解 web mvc 配置的工作原理?

Java Spring Redis : Set time to live with annotation

javascript - Selenium JavaScript Executor 对 .checked 返回 null,但对 .click() 有效?

java - 标有原型(prototype)范围的 Bean 在 Spring 中不起作用

java - 导入 270000 行数据时的 Hibernate 问题

java - 无法转换项目 : C:\workspace_IntelliJ\Main\new-webapp\. idea\workspace.xml:第 1 行错误:序言中不允许内容

java - Spring Security - @Secured 仅适用于 mvc Controller

java - 创建另一个类的对象的 ArrayList 并操作它们

java - Android 异常 Intent ,找不到 Activity