Spring 3 中为 Bean 定义了 5 中作用域,分别为 singleton(单例)、prototype(原型)、
request、session 和 global session,5 种作用域说明如下:
singleton:单例模式(多线程下不安全)
1. singleton:单例模式,Spring IoC 容器中只会存在一个共享的 Bean 实例,无论有多少个
Bean 引用它,始终指向同一对象。该模式在多线程下是不安全的。Singleton 作用域是
Spring 中的缺省作用域,也可以显示的将 Bean 定义为 singleton 模式,配置为:
<bean id=”userDao” class=”com.ioc.UserDaoImpl” scope=”singleton”/>
prototype:原型模式每次使用时创建
2. prototype:原型模式,每次通过 Spring 容器获取 prototype 定义的 bean 时,容器都将创建
一个新的 Bean 实例,每个 Bean 实例都有自己的属性和状态,而 singleton 全局只有一个对
象。根据经验,对有状态的bean使用prototype作用域,而对无状态的bean使用singleton
作用域。
Request:一次 request 一个实例
3. request:在一次 Http 请求中,容器会返回该 Bean 的同一实例。而对不同的 Http 请求则会
产生新的 Bean,而且该 bean 仅在当前 Http Request 内有效,当前 Http 请求结束,该 bean
实例也将会被销毁。
<bean id=”loginAction” class=”com.cnblogs.Login” scope=”request”/>
session
4. session:在一次 Http Session 中,容器会返回该 Bean 的同一实例。而对不同的 Session 请
求则会创建新的实例,该 bean 实例仅在当前 Session 内有效。同 Http 请求相同,每一次
session 请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的 session 请求
内有效,请求结束,则实例将被销毁。
<bean id=”userPreference” class=”com.ioc.UserPreference” scope=”session”/>
global Session
5. global Session:在一个全局的 Http Session 中,容器会返回该 Bean 的同一个实例,仅在
使用 portlet context 时有效。