spring 作用域理解

今天抽空看了一下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 ,专门解决这种问题的。

转载于:https://my.oschina.net/u/1169079/blog/2999394

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值