在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)如果一个对象被多个线程所共享,并且对象中存在共享数据,一旦这个数据被多个线程所操作,就可能会产生线程不平安问题,能够思考应用多例