Bean对象的作用范围
Posted brent
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bean对象的作用范围相关的知识,希望对你有一定的参考价值。
在Spring容器中管理的Bean对象的作用域,可以通过scope属性或用相关注解指定其作用范围。
<bean id="user" scope="singleton" class="com.tedu.pojo.User"></bean>
1、Bean的scope属性常用取值:
1)scope="singleton":单实例(默认值)
2)scope="prototype":多实例
singleton (单例)或 prototype (多例)其含义如下:
1) singleton:单实例(默认),如果不指定scope属性(或者@Scope注解),spring容器中默认所有的bean都是单实例的。即,spring为每个类只创建一个实例。无论获取多少次,返回的都是同一个实例。
另外,单实例的bean是再beans.xml文件一被读取就会创建实例,而且会存入到bean池中。
优点:无论获取多少次,返回都是同一个实例,因为每个类只创建一个实例,可以节省内存空间,减少资源浪
费。
缺点:可能会引发线程安全问题(如果这个唯一对象上有共享数据,并且有多个线程会同时操作这个共享数
据)
2) prototype:多实例,当指定scope="prototype"属性(或者指定@Scope("prototype")注解)时,当前bean就是多实例的。每次通过spring容器获取实例时,spring容器都会重新创建该类的实例。即每次返回的都是不同的实例。
另外,多实例的bean是每次获取时才会创建,而且创建的实例不会存到bean池中。
优点:不会引发线程安全问题(因为每个线程持有的实例是不同的)
缺点:由于每次获取都会创建新的实例,会占用服务器的内存空间,造成资源浪费。
2、什么时候使用单例和多例?
1)从使用频次上考虑,如果一个对象使用的频率非常高,建议使用单例,这样会将bean对象存储到bean池中,从始至终只有一个实例,可以减少对象创建,减少对资源的消耗。
2)在没有线程安全问题的前提下,没必要每次获取都创建一个对象,这样子既浪费CPU又浪费内存;
3)从使用频次上考虑,如果一个对象使用的频率非常低,没有必要将对象存储到map中(存储到bean池中的对象会一直存在bean池中,在spring容器销毁时销毁),建议使用多例。
4)如果一个对象被多个线程所共享,并且对象中存在共享数据,一旦这个数据被多个线程所操作,就可能会产生线程不安全问题,可以考虑使用多例
以上是关于Bean对象的作用范围的主要内容,如果未能解决你的问题,请参考以下文章
Spring在AuthenticationSuccessHandler中自动装配会话范围bean不起作用
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段