spring单例 与 设计模式单例的 区别

spring 中单例:

spring针对一个IOC容器维持一个bean实例, 这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例;

public class HelloController implements Controller{
   
    private String view;
    private static Logger logger = Logger.getLogger(HelloController.class.getName());

    @Override
    public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1)
            throws Exception {
        logger.info("handleRequest " + this.getClass().getName());
        String hi = arg0.getParameter( "test");
        return new ModelAndView(view, "test", hi);
    }
   
    public void setView(String view) {
        this.view = view;
    }
}

该controller 类的内存管理如下:

1) 描述 HelloController 的类信息保存在方法区
2) 描述 view 变量的信息保存在运行时常量区
3) 描述 logger 变量的信息及其引用值保存在方法区
4) 同样在堆中也会创建该controller类的Class实例
 
在实际执行的过程中,由于spring所维护的controller为单例(即对于spring程序上下文来说,只存在一份controller实例), 不同线程获取该实例进行处理时,实际上是对同一份内存区域进行处理, 因此造成controller的单例对象及其内的成员变量也具有伪“static”的属性, 在内存中仅有一份,这里的一份是对于当前spring IOC容器来说

设计模式中的单例: 

public class Singleton {
    private static Singleton sing = new Singleton();
   
    private Singleton() {}
    public static Singleton getInstance() {
        return sing ;
    }
    
}

单例内存管理情况如下:

1) Singleton的类信息会保存在方法区内,包括类名,类属性等
2) private static Singleton sing  这个静态变量也保存在方法区
3) new Singleton();  生成的对象实例保存在堆中, 在堆中会创建Singleton类的Class实例作为该类信息的引用入口
posted @ 2015-03-03 15:30  hewep  阅读(676)  评论(0编辑  收藏  举报