1.6 bean的作用域

IOC容器通过XML配置文件定义bean,即描述如何在IOC容器中创建一个对象实例。bean是IOC容器中的对象,在配置bean时可以指定bean对象的作用域。Spring支持5种作用域(其中有3种只能用在基于Web的ApplicationContext中)。表1.2列出了这5种作用域及对应的描述,接下来会重点介绍singleton作用域和prototype作用域。

表1.2 Spring支持的5种作用域

1.6.1 singleton作用域

当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。singleton作用域是Spring中的默认作用域。

如图1.4所示,IOC容器中只会存在一个共享的bean实例accountDao,所有对bean的请求,只要id与该bean定义相匹配,都只会返回bean的同一实例。

图1.4 singleton作用域

1.6.2 prototype作用域

配置为prototype作用域的bean,会在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。根据经验,对有状态的bean应该配置为prototype作用域,而对无状态的bean则应该配置为singleton作用域。Prototype作用域如图1.5所示。

图1.5 prototype作用域

图1.5描述了配置为prototype作用域的bean的特点。不过不要被图例所误导,通常情况下,DAO对象不会被配置成prototype作用域,因为DAO对象通常不会持有任何会话状态,所以应该被配置成singleton作用域。要在XML配置文件中将bean定义成prototype作用域,可以按如下方式配置:

    <bean id="…" class="…" scope="prototype"></bean>

当singleton bean依赖prototype bean时,请注意依赖是在实例化时处理的。也就是说,如果要把一个prototype bean注入到singleton bean,实际上只是实例化一个新的prototype bean注入到singleton bean,并不是每次调用singleton bean的获取属性方法就能获得一个新的prototype bean的实例。