如何在Spring中使用Singleton对象?

时间:2014-05-08 06:19:23

标签: java spring

我是Spring Framework的新手。我在春天尝试了以下示例。

@Path("/XZY")
@Service
@Transactional
public class XZY {

    @Autowired
    SampleDAO sampleDao;

    @Autowired
    TestDAO testDao;

     @Autowired
    XZYinterface xzyinterface;

    @POST
    @Produces("text/plain")
    @Path("/checkservice")
    public Response XZYservice(@FormParam("Code") String Code,
            @FormParam("source") String source,
            @FormParam("value") String value)  {
            //return xzyinterface.checkXYZService(Code,sourceName,source); 
        XZYinterface xyz = ServiceFactory.getXZY(999);
        return xyz.checkXYZService(Code,sourceName,source);


    }
}

以下代码将用于创建单例对象

public class Singleton {
        private static sampleA sampleClassA=null;
        private static SampleB sampleClassB=null;
        public static XZYAbstract getXZY(long id){
                if(id == 999){
              if(sampleClass == null){
                sampleClassA = new sampleA();
                }
               return sampleClass;
                     }
                if(id == 9999){
                    sampleClassB = new sampleA();
                }
                return sampleClassB;
        }
}

界面

public interface XZYinterface {
    Response XZYservice(String Code, String source,String value)
}

抽象类和实现接口

public class XZYAbstract implements XZYinterface {
    public XZYAbstract(){
        super();
    }
    @Autowired
    SampleDAO sampleDao;

    @Autowired
    TestDAO testDao;

    public Response checkXYZService(String Code,String source,String value){

    String sample = sampleDao.getValue(code);

    //..source code

    }
}

以下类扩展了抽象类。

public class sampleA extends XZYAbstract {

    //some methods.
}

如果我运行应用程序,则会抛出以下错误

 SEVERE [com.sun.jersey.spi.container.ContainerResponse] The RuntimeException could not be mapped to a response, re-throwing to the HTTP container: java.lang.NullPointerException
    at com.test.xyz.XZYAbstract.checkXYZService(XZYAbstract.java:112) [:]
    at com.test.XYZ.XZYservice(XZY.java:140) [:]

如果我直接调用没有单例对象,则使用自动连线( // return xzyinterface.checkXYZService(Code,sourceName,source); )正确初始化值,并且它正常工作。 从单例对象抛出,值(sampleDAo,testDao)未正确初始化。

如何解决此错误?

1 个答案:

答案 0 :(得分:1)

原因很简单:因为Spring只是一个库,而不是对Java语言的改变。 Spring不会检测也不会增强构造函数,因此获取初始化Spring bean的唯一方法是从Spring上下文中获取它

如果你致电new Bean(),你就会变成Bean实例不受Spring的影响

关于如何使用singleton bean的问题:什么都不做。 Spring bean默认是单例。您可以通过@org.springframework.beans.factory.config.Scope注释指定其他范围。请参阅示例@Scope("prototype") bean scope not creating new bean,它是如何工作的。