今天抽空看了一下Spring做用域,以前对这些细节点没有太在乎。可是做为一个Java爱好者仍是须要认真学习的。言归正传html
Spring bean目前有singleton,prototype、request、session、global session5种做用域,默认使用的是singleton, 即 scope=“singleton“。web
一、singleton设计模式
当设置scope=“singleton“,Spring IOC在整个上下文中始终只有一个实例对象,全部请求都会返回相同的实例对象,即该实例对象共享,另外值得注意得失该singleton与安全
设计模式中的单利模式是有区别的,设计模式中的单例模式是至整个jvm中,Classloader始终加载的是一个类,在Spring IOC容器中只有一个实例对象,这个单例会被存储在session
singleton cache中,它在整个容器中是彻底共享的包括代码和空间数据。jvm
二、prototype学习
当设置scope=“prototype“时,每一次请求都会从容器中产生一个新的bean,至关于new一个新的对象,对于prototype下的bean的生命周期是不受Spring管理的,彻底交给代码人员去管理,也就是说bean资源的清除,消费空间等都须要编码人员把握。编码
三、requestspa
当设置scope=“request“时,该模式只对request请求新建一个bean,并且只对http request请求有效,那么https是不支持的prototype
四、session
当设置scope=“session“时,该做用域只对http请求新建一个bean,并且只对http session 有效
五、global session
当设置scope=“global session“时 该做用域确切的讲只对标准的http session有效,可是只有在portlet的web应用中才有意义,由于portlet中有全局session的概念,也就说明了bean的生命周期被限定在了portlet的session中
总结:只关注前两singleton 与prototype 便可,目前经常使用的是singleton;考虑线程安全问题,咱们经常使用service,dao之因此是singleton是由于他们都是无状态对象,不带有任何的数据,若是某一个service设置成员变量了那么它就须要声明scope=“prototype“,不然数据共享确定会产生线程安全问题,可是一旦使用了scope=“prototype“做用域它的资源消耗也是很大的须要慎重考虑使用场景,另外若是存在单例做为属性注入到多例中去的时候能够考虑lookup-method ,专门解决这种问题的。