共计 1008 个字符,预计需要花费 3 分钟才能阅读完成。
在 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)如果一个对象被多个线程所共享,并且对象中存在共享数据,一旦这个数据被多个线程所操作,就可能会产生线程不平安问题,能够思考应用多例