当前位置: 首页 > 知识库问答 >
问题:

spring bean的单例实现

苏彦君
2023-03-14

我们将一个spring bean实现为单例(默认)。此bean用作Web服务的一部分,当触发多个同时请求时,responseholder(单例bean)在尝试检索时抛出NullPointerException。这通常发生在响应是build的时候,然后在发送回原始响应之前触发了一个新的请求。

这可能是bean的单点实现造成的吗?如果是的话,就不会改成原型来解决我的问题了。总是用新操作员启动它怎么样?这样做是否会对性能产生影响?还是有更好的办法。

如有任何帮助,将不胜感激。

编辑:

代码详细信息

public class BuildToolRequestProcessor {

private BuildToolResponse buildToolResponse;
.....


//And it has been referenced in the code in different methods, setting the response details..

public String process(BuildToolRequestXml buildToolRequestXml) throws Exception {

buildToolResponse.setLocation(location);
...


public String handleDetails(BuildToolRequestXml buildToolRequestXml) throws Exception {


buildToolResponse.setSchedule(schedule);
...

// And in another method, when I try to retrieve the Location, it throws a Null Pointer Exception..

buildToolResponse.getLocation().getPinCode()


//Bean configuration

<bean id="buildToolResponse"
      class="com.raj.buildTool.processor.BuildToolResponse"/>

附加说明:我尝试在第一个请求的响应之前引入一个延迟,然后拍摄另一个请求。第二个请求将该位置重置为空,因此在尝试检索该位置时抛出NPE。会不会是因为那个单身?此外,我还没有使用new操作符重新初始化buildToolResponse,但是类buildToolResponse从BuildToolResponseBuilder扩展而来,我正在使用“new”初始化BuildToolResponseBuilder来构建响应。

共有1个答案

杨无尘
2023-03-14

这可能是bean的单点实现造成的吗?如果是的话,就不会改成原型来解决我的问题了。

如果您有一个单例bean,请确保此bean不维护任何状态。这意味着,它不应该有任何基于某些方法重新初始化的字段,除了由spring完成的另一个bean或资源的注入。这可能会导致并发问题,特别是在多个线程中使用bean时(在本例中,处理对web服务的多个请求)。

这是一个将在多线程上使用的spring bean的错误设计示例

@Component
public class SingletonByDefaultBean {
    private StringBuilder responseBuilder;

    @Autowired
    private FooService fooService;

    public String methodUsedInSeveralThreads() {
        //here you will have a concurrency issue
        responseBuilder = new StringBuilder();
        //write contents into the response
        //...
        //return the response
        return responseBuilder.toString();
    }
}

要解决这个问题,您有两种方法:

>

  • 删除bean的任何状态,并将属性移动到方法局部变量中:

    @Component
    public class SingletonByDefaultBean {
        //private StringBuilder responseBuilder;
    
        @Autowired
        private FooService fooService;
    
        public String methodUsedInSeveralThreads() {
            StringBuilder responseBuilder = new StringBuilder();
            //write contents into the response
            //...
            //return the response
            return responseBuilder.toString();
        }
    }
    

    将bean的作用域更改为prototype

    @Component
    @Scope("prototype")
    public class SingletonByDefaultBean {
        private StringBuilder responseBuilder;
    
        @Autowired
        private FooService fooService;
    
        public String methodUsedInSeveralThreads() {
            responseBuilder = new StringBuilder();
            //write contents into the response
            //...
            //return the response
            return responseBuilder.toString();
        }
    }
    

    总是用新操作员启动它怎么样?

    参考这个答案,了解如何手动创建实例您的类,并使其由spring管理。这不是那么容易的,我建议只有当你真正了解你在做什么的时候才使用这些方法。

  •  类似资料:
    • 当我得到一个Spring豆(通过getBean())时,有没有办法从java代码中验证豆子是否已经用范围=原型定义了? Spring配置: Java: sc 我可以实例化它两次并比较对象,但是我想避免不必要的对象创建。这个答案的反义词可能会有用:https://stackoverflow.com/a/9125610/156477

    • 我想制作一个AngularJS Spring MVC Hibernate MySQL应用程序。我不知道如何配置SpringBean,这样我就可以对我的存储库和实体类使用自动连接的注释。 pom.xml依赖: 实体类: 的存储库: 的控制器: 配置类:

    • 本文向大家介绍jstree的简单实例,包括了jstree的简单实例的使用技巧和注意事项,需要的朋友参考一下 最近使用到了jstree,感觉是一款灵活的、可多项定制的tree插件; 我这边使用过程记录下; 参考的jstree api网站,以及demo介绍: https://www.jstree.com/api/#/ jstree api github: https://github.com/vaka

    • 本文向大家介绍python实现简单的socket server实例,包括了python实现简单的socket server实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python实现简单的socket server的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的Python程序设计有所帮助。

    • 本文向大家介绍javascript实现继承的简单实例,包括了javascript实现继承的简单实例的使用技巧和注意事项,需要的朋友参考一下 作为一门面向对象的语言,那么继承自然就是一大特征,下面是一段非常简单代码实例,它演示了实现继承的基本原理,有兴趣的或者恰好要学习此方面的朋友可以参阅一下,希望能够给大家来帮组。 以上所述就是本文的全部内容了,希望大家能够喜欢。

    • 本文向大家介绍javascript实现的闭包简单实例,包括了javascript实现的闭包简单实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了javascript实现的闭包。分享给大家供大家参考。具体如下: 希望本文所述对大家的javascript程序设计有所帮助。