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实例作为该类信息的引用入口