史上最详细-容器中Bean的作用域

152 阅读2分钟

一、容器中Bean的作用域

当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为指定的Bean指定特定的作用域。

Spring支持5种作用域:
(1) Singletion:单例模式,在整个SpringIOC容器中,使用singleton定义的Bean将只有一个实例。
(2) Prototype:原型模式,每次通过容器的getBean方法获取Prototype定义的Bean时,都将产生一个新的Bean实例。
3)request:对于每次HTTP请求,使用request定义的Bean都将产生一个新的实例,即每次请求时都会产生不同的Bean实例,只有在WEB应用种使用Spring时,该作用域才会真的生效。
(4) session:对于每次HTTPSession,使用session定义的Bean都将产生一个新的实例时,即每次HTTPSession都将产生不同的Bean实例,同HTTP一样,只有在WEB应用才会生效。
(5)glbal session:每个全局的HTTPSession对应一个Bean实例,仅在portlet Context的时候才会生效。


比较常用到的singleton和prototype,如果一个Bean实例被设置为singleton,那么每次请求该Bean时都会获得 相同的实例 。

容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为,如果一个Bean实例被设置为peototype,那么每次请求该id的Bean,Spring都会创建一个新的Bean实例返回给程序,在这种情况下,Spring容器仅仅使用new关键字创建Bean实例,一旦创建成功,容器将不再跟踪实例,也不会维护Bean实例的状态。

Java在创建java实例的时候,需要进行内存申请,销毁实例时,需要完成垃圾回收。这些工作都会导致系统开销的增加,因此,prototype作用域Bean的创建、销毁代价会比较大,而singleton作用域的Bean实例一旦创建成功,可以重复使用,除非比要,否则尽量避免将Bean的作用域设置为Prototype.

设置Bean的作用域是通过scope属性指定.

image.png

image.png

image.png

image.png

image.png

image.png

一旦web.xml中增加上面两种配置中的一种,程序就可以在Spring配置文件中使用requst或session作用域中了。如下:

image.png

上面的配置文件配置了一个实现类Person的Bean,指定他的作用域为request,这样Spring容器会为每次的HTTP请求生成一个Person的实例,当该请求响应结束时,该实例也会被注销。