简体   繁体   中英

How to use Singleton object in Spring?

I am newbie to Spring Framework.I have tried following example in spring.

@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);


    }
}

The following code will use to create singleton object

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;
        }
}

Interface

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

Abstract class and implements Interface

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

    }
}

The following class extends abstract class.

public class sampleA extends XZYAbstract {

    //some methods.
}

If i run the application it throws following errors

 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) [:]

If i call directly without singleton object, values are initialized properly using Auto wired ( //return xzyinterface.checkXYZService(Code,sourceName,source); ) and it's working fine. Throw from singleton object, values(sampleDAo,testDao) are not initialized properly.

How to resolve this error?

The reason is quite trivial: it's because Spring is just a library, and not a change to the Java language. Spring doesn't instrument nor enhance constructors, so the only way to get initialized Spring bean is to get it from the Spring context .

If you call new Bean() , you becomes Bean instance untouched by Spring .

For the question how to use singleton bean: do nothing . Spring beans are Singletons by default. You can specify other scope via @org.springframework.beans.factory.config.Scope annotation. See for example @Scope("prototype") bean scope not creating new bean , how it works.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM