【Spring学习笔记五】-Bean的作用域

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Kevin_zhai/article/details/52274621
一、Bean作用域类型
Spring定义了多种作用域,可以基于这些作用域创建Bean。Spring包括以下四种作用域:
(1) 单例(Singleton):在整个应用中,只创建bean的一个实例
(2) 原型(Prototype):每次注入或者通过Spring应用上下文获取时,都会创建一个新的bean实例
(3) 会话(Session):在Web应用中,为每个会话创建一个bean实例。
(4) 请求(Request):在Web应用中,为每个请求创建一个bean实例。
在默认情况下,Spring应用上下文中的所有bean都是作为单例的形式创建的。也就是说,不管给定的一个bean被注入到其他bean多少次,每次注入的都是同一个实例。如果要选择其他的作用域,有两种方法,一种是使用@Scope,另一种是在XML配置文件里进行配置。

下面以声明作用域为原型为例,分别介绍这两种方法。使用@Scope标注代码如下:

@Component("stoneAxe")
@Scope("prototype")
public class StoneAxe implements Axe{
	@Override
	public String chop() {
		return "石斧砍柴好慢";
	}
}
如果使用XML来配置Bean的话,可以使用<bean>元素的scope属性来设置作用域。如下:

<bean id="Chinese" class="com.ceshi.service.imp.Chinese" scope="prototype"/>
二、使用会话和请求作用域
首先,我们先看一个例子。我们在网上购物时,都会用到加入购物车功能,假如后台有一个bean代表用户的购物车。如果购物车是单例的话,那么会导致所有的用户都会向同一个购物车中添加商品。另一方面,如果购物车是原型作用域的,那么在应用中某一个地方往购物车中添加商品,在应用的另外一个地方可能就不可用了,因为在这里注入的是另外一个原型作用域的购物车。
就购物车bean来说,会话作用域是最为合适的。使用@Scope注解如下:
@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.INTERFACES)
public ShoppingCart cart() { … }
在这里,不止有value字段,还有一个proxyMode属性。这个属性解决了将会话或请求作用域的bean注入到单例bean中遇到的问题。

没有更多推荐了,返回首页