在Spring IOC容器中,由它管理的Java Bean具有作用范围。
Spring1.x版本
在Spring1.x版本中,标签有一个属性singleton,取值为布尔类型。如果将其设置为true,那么容器之中只存在一个该bean的共享实例,当其他的任何Bean依赖该bean时,只要请求的id与该bean的id相同,容器就将该bean的实例注入到请求的bean中。换言之,Spring IoC容器只是创建该bean的一个唯一实例,并把它存存贮在容器的单例缓存中,在需要时才将其取出。这样的受管bean称之为“单例bean”。如果设置为false,那么每当其他bean依赖此bean时,容器则会重新实例化一个该bean对象,为其注入。
需要注意的是:
1、在下面的例子中,如果把computer1和computer2两个受管bean都设置成单例bean,Spring IoC容器则分别实例化两个bean,把它们作为两个不同的bean对待,尽管他们的类相同。
1 | < bean id = "computer1" class = "ioc.test.Computer" scope = "singleton" /></ bean > |
2 | < bean id = "computer2" class = "ioc.test.Computer" scope = "singleton" /></ bean > |
3、Spring IoC容器不会维护prototype类型的bean的整个声明周期,容器在实例化、配置、注入之后就把它扔给调用者,然后就不管了。
4、如果一个单例bean computer引用了一个prototype类型的bean host,由于单例bean只初始化一次,所以不能保证每次调用computer时host都是最新的。解决办法是使用lookup方法注入。
Spring2.0时代
到了Spring2.0时代,scope属性代替了原来的的singleton属性,scope提供了更多的选项,从而可以更加灵活的配置bean的作用范围。Spring2.0中,scope属性有如下可能的取值,说明如下:1、 singleton,即单例bean,和1.x中singleton=”true”相同。
2、 prototype,同Spring1.x中的singleton=”false”。
3、 request,这种bean在web的request范围内有效,即每次请求时都会产生一个实例。只用于web程序中。
4、 session,这种bean在web的session范围内有效。只用于web程序中。
5、 global session,这种bean在web的全局session范围内有效。只用于web portlet框架中。