作用域
-
在介绍IoC容器最顶级接口BeanFactory 的时候,可以看到 isSingleton 和isPrototype 两个方法。
-
其中,isSingleton 方法如果返回true,则Bean在IoC容器中以单例存在,这也是Spring IoC容器的默认值;
如果isPrototype方法返回true,则当我们每次获取Bean的时候,IoC 容器都会创建一一个新的Bean,这显然存在很大的不同,这便是Spring Bean 的作用域的问题。 -
在一般的容器中,Bean 都会存在单例(Singleton)和原型(Prototype) 两种作用域,Java EE广泛地使用在互联网中,而在Web 容器中,则存在页面(page)、请求(request)、 会话( session)和应用(application) 4种作用域。
-
对于页面(page),是针对JSP当前页面的作用域,所以Spring是无法支持的。为了满足各类的作用域,在Spring的作用域中就存在如表所示的几种类型。
作用域类型 使用范围 作用域描述 singleton 所有 Spring 应用 默认值, loC 容器只存在单例 prototype 所有 Spring 应用 每当从 IoC 容器中取出一个 Bean ,则创建 个新的 Bean session Spring Web 应用 HTTP 会话 application Spring Web 应用 Web 工程生命周期 request Spring Web 应用 Web 工程单次请求( request) globalSession Spring Web 应用 在一个全局的 HTTP Session 中, Bean 定义对应 个实例 实践中基本不使用 对于表中的作用域,常用的是加粗的4种。对于 application 作用域,完全可以使用单例来替代。
单例(SingLeton)和原型( Prototype)的区别
@Component
**//@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)**
public class ScopeBean {}
把 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
注释掉, 这样就是启用默认的作用域,实际就是单例 。
这里的ConfigurableBeanFactory 只能提供单例(
SCOPE_SINGLETON
)和原型(SCOPE_PROTOTYPE
)两种作用域供选择;
如果是在Spring MVC环境中,还可以使用WebApplicationContext
去定义其他作用域,如请求(SCOPE_REQUEST
)、会话(SCOPE_SESSION
)和应用(SCOPE_APPLICATION
)。
例如,下面的代码就是定义请求作用域。
WebApplicationContext.SCOPE_REQUEST
@Component
@Scope(WebApplicationContext.SCOPE REQUEST)
public class ScopeBean {}
这样同一个请求范围内去获取这个Bean的时候,只会共用同一个Bean,第二次请求就会产生新的Bean。因此两个不同的请求将获得不同的实例的Bean,这一点是需要注意的。