(给ImportNew加星标,提高Java技能)
转自:开源中国,作者:麦克斯
链接:my.oschina.net/wang5v/blog/3017934
Request、Session、Application概念
在这篇Spring源码解析-Singleton Scope(单例)和Prototype Scope(多例)博客中介绍了2个比较常用的scope同时也简单的介绍了本篇博客要讲的这三个不常用的scope的概念,今天来详细揭开这3个很不常用的scope。 这三个只能用于web应用中,即要用于Web的Spring应用上下文(如:XmlWebApplicationContext),如果你用于非web应用中(如ClassPathXmlApplicationContext)是会抛出异常的。
Request Scope
第一个要介绍的就是Request了,顾名思义,如果bean定义了这个scope,标示着这个bean的生命周期就是每个HTTP Request请求级别的,换句话说,在不同的HTTP Request请求中,Request Scope的bean都会根据bean的definition重新实例化并保存到RequestAttribute里面。这也就是说,这个实例只会在一次请求的全过程中有效并可见,当请求结束后,这个bean就会被丢弃,生命周期很短的。又因为每次请求都是独立的,所以你修改Request Scope的bean是只对内部可见,其他的通过相同的bean definition创建的实例是察觉不到的。 怎么去定义Request Scope呢?Spring提供了两种方式: 一种XML方式配置:
"testRequest" class="com.demo.TestRequest" scope="request"/>
另外一种就是注解的方式:
@RequestScope
@Component
public class TestRequest{
// ...
}
这样我们就指定了这个Bean的scope为Request的。但是,Request、Session和Application的用法不只是这样就可以了,后面在应用中会更加详细介绍怎么去用这三个东西。
Session Scope
接下来谈下这个Session Scope,会话级别的。scope指定为Session的bean,Spring容器在单个HTTP会话的生命周期中使用bean定义来创建bean的新实例,也就是说,在每次会话中,Session Bean 会实例化,并保存到RequestAttribute里面,跟Request不同的是,每个会话只会实例化一次,而request是每次请求都会实例化一次。当我们,定义了Session的bean,那么标记着这个bean的生命周期就是在一次完整的会话中,所以在特定的HTTP Session 中bean的内部状态修改了,在另外的HTTP Session 实例中根据一样的bean definition创建的实例是感知不到的。当session结束时,这个bean也会随之丢弃掉。 定义Session Scope也有两种方式: 一种XML方式:
"testRequest" class="com.demo.TestRequest" scope="session"/>
另外一种就是注解的方式:
@SessionScope
@Component
public class TestRequest{
// ...
}
Application Scope
被Application标记的bean指示了Spring容器通过对整个web应用程序一次性使用bean定义来创建bean的新实例。也就是说,Application Scope bean的作用域在ServletContext级别,并存储为一个常规的ServletContext属性里面。这个跟单例有点类似,但是却是不同的,每个ServletContext里是单例,但是对于Spring的每个ApplicationContext就不一定了。 定义Application Scope也有两种方式: 一种XML方式:
"testRequest" class="com.demo.TestRequest" scope="application"/>
另外一种就是注解的方式:
@ApplicationScope