今天抽空看了一下Spring作用域,之前对这些细节点没有太在意。但是作为一个Java爱好者还是需要认真学习的。言归正传
Spring bean目前有singleton,prototype、request、session、global session5种作用域,默认使用的是singleton, 即 scope=“singleton“。
1、singleton
当设置scope=“singleton“,Spring IOC在整个上下文中始终只有一个实例对象,所有请求都会返回相同的实例对象,即该实例对象共享,另外值得注意得失该singleton与
设计模式中的单利模式是有区别的,设计模式中的单例模式是至整个jvm中,Classloader始终加载的是一个类,在Spring IOC容器中只有一个实例对象,这个单例会被存储在
singleton cache中,它在整个容器中是完全共享的包括代码和空间数据。
2、prototype
当设置scope=“prototype“时,每一次请求都会从容器中产生一个新的bean,相当于new一个新的对象,对于prototype下的bean的生命周期是不受Spring管理的,完全交给代码人员去管理,也就是说bean资源的清除,消费空间等都需要编码人员把握。
3、request
当设置scope=“request“时,该模式只对request请求新建一个bean,而且只对http request请求有效,那么https是不支持的
4、session
当设置scope=“session“时,该作用域只对http请求新建一个bean,而且只对http session 有效
5、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 ,专门解决这种问题的。