singleton
容器只为bean创建一个实例。
客户端每次请求都返回一个共享实例。
客户端不能控制bean的生命周期。
由容器控制bean的产生,销毁。
prototype
每次请求bean时。都会创建一个新的实例。
客户端每次请求(调用getBean(“”)方法)都产生一个新的实例。
实例化后,完全交给客户端代码管理,容器不再追踪其生命周期。并不知道bean何时销毁。
request
用于web应用,bean在一次请求中有效。
session
用于web应用,bean在整个会话中有效。
使用经验:
0. Singleton作用域是Spring中的缺省作用域。
1. 结合Struts每次请求都产生一个新的action bean,所以结合Struts的使用,就用prototype。
2. 典型情况下,DAO不会被配置成prototype,因为一个典型的DAO不会持有任何会话状态,因此应该使用singleton作用域。
3. 如果你用"singleton"属性那么就必须在那个文件里引用'spring-beans.dtd' DTD。 如果你用"scope"属性那么必须 在那个文件里引用'spring-beans-2.0.dtd' DTD 或'spring-beans-2.0.xsd' XSD。
4. request、session以及global session仅仅在使用基于web的Spring ApplicationContext实现(如XmlWebApplicationContext)时有用,如果在普通的Spring IoC容器中,比如像XmlBeanFactory或ClassPathXmlApplicationContext,尝试使用这些作用域,你将会得到一个IllegalStateException异常(未知的bean作用域)。
5. 对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。