Bean Scopes
Scope在web开发中只文档使用的范围,在Spring中它依然是表示范围的。Bean的一个属性,只Bean的范围。
Scope | 解释 |
singleton | 单例模式,每次取到的bean都是同一个(默认情况是这个) |
prototype | Prototype:每次拿到的都是一个新的对象。 |
request | 几乎不用 |
session | 几乎不用 |
global session | 几乎不用 |
一、当Scope为“默认或者是singleton”的时候,修改beans.xml文件:(第一节中的beans.xml中修改)
<bean id="userService" class="com.xxx.service.UserService" scope="singleton">
<property name="userDAO" ref="userDAO" />
</bean>
在测试类中查看:
..... UserService service = (UserService)applicationContext.getBean("userService"); UserService service2 = (UserService)applicationContext.getBean("userService"); System.out.println(service == service2); .....
输出结果:2014-2-20 15:21:47 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1c92535: defining beans [userDAO,userService]; root of factory hierarchy true user succeed add!
二、当Scope为“prototype”,同上面一样,可以得出结果:
2014-2-20 15:28:02 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@12a3793: defining beans [userDAO,userService]; root of factory hierarchy false user succeed add!
也就可以得出,当scope为默认或者singleton时,不管取多少次都是一样的。当Scope取prototype时,总是取到新的。当为Action的时候,推荐使用Prototype。
集合注入:假如UserDAO里面有
private Set<String> sets;
private List<String> lists;
private Map<String, String > maps;
....
等更多的集合,并且拥有它们各自的Setter方法,我们现在需要在beans.xml文件中配置:
... <property name = "sets"> <set> <value>1</value> <value>2</value> </set> </property> <property name="lists"> ... </property> <property name="maps"> ... </property> ...