Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Springbean的单例实现_Java_Spring_Singleton_Prototype - Fatal编程技术网

Java Springbean的单例实现

Java Springbean的单例实现,java,spring,singleton,prototype,Java,Spring,Singleton,Prototype,我们有一个Springbean实现为单例(默认)。此bean用作web服务的一部分,当触发多个同时请求时,responseholder(singleton bean)在尝试检索时抛出NullPointerException。这通常发生在响应生成时,然后在发送原始响应之前触发新请求 这可能是由于bean的Singleion实现造成的吗?如果是的话,是不是改变原型解决不了我的问题。总是和新的接线员一起启动怎么样?这样做是否会对性能产生影响?还是有更好的办法 任何帮助都将不胜感激 编辑: 代码详细信息

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

这可能是由于bean的Singleion实现造成的吗?如果是的话,是不是改变原型解决不了我的问题。总是和新的接线员一起启动怎么样?这样做是否会对性能产生影响?还是有更好的办法

任何帮助都将不胜感激

编辑

代码详细信息

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"/>
公共类BuildToolRequestProcessor{
私有BuildToolResponse BuildToolResponse;
.....
//代码中以不同的方法引用了它,设置了响应细节。。
公共字符串进程(BuildToolRequestXml BuildToolRequestXml)引发异常{
buildToolResponse.setLocation(位置);
...
公共字符串handleDetails(BuildToolRequestXml BuildToolRequestXml)引发异常{
buildToolResponse.setSchedule(时间表);
...
//在另一个方法中,当我试图检索位置时,它抛出一个空指针异常。。
buildToolResponse.getLocation().getPinCode()
//Bean配置
其他注意事项:我尝试在构建第一个请求的响应之前引入延迟,触发另一个请求。第二个请求将位置重置为NULL,因此在尝试检索位置时引发NPE。这可能是因为单例的原因吗?我还没有使用初始化buildToolResponse again使用新操作符,但是BuildToolResponse类扩展自BuildToolResponseBuilder,我正在使用“new”初始化它以生成响应

这可能是由于bean的Singleion实现造成的吗?如果是的话,那么原型的改变不会解决我的问题

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

这是一个将在多个线程上使用的SpringBean的糟糕设计示例:

@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的范围更改为原型

    @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管理。这并不是那么容易,我建议只有在您真正了解自己在做什么的情况下才使用这些方法。

    向我们展示您的bean以及如何使用它们,从何处获得NPE。此外,这是真正的singleton还是Spring管理的singleton?@SotiriosDelimanolis似乎是一个单例范围的Springbean,由(默认)注释问题第一句中的文本。@SotiriosDelimanolis添加了更多的细节hanks。您使用新操作符提供的第一个选项是否会对性能产生影响?@Chillax,这将取决于bean创建后的功能。如果您在创建bean后执行繁重的长时间运行任务,则是的,它将产生影响对性能的影响…如果没有看到bean的设计,这个问题很难回答。您已经添加了实现细节。如果您可以看一看,请?@Chillax看起来不会有任何性能影响。但是由您来测试和演示。谢谢。但是因为我没有使用new来初始化响应,它没有重新初始化是吗?那为什么会发生这种情况,有什么想法吗?