spring bean的作用域

spring默认情况下:spring应用上下文的所有bean都是以单例形式创建的,也就是说一个bean在应用中只创建一次,不管是将真个bean注入到多少个其他bean中,注入的都是同一个bean。

存在的问题:单例的bean在某些情况下存在弊端。例如,在商城系统中每一个用户需要有一个购物车,比如叫cart。但如果cart是单例的,也就是说整个商城中所有的用户共用一辆购物车,这明显是不合理的。正确的做法是为每一个用户配一辆cart,也就是在Web应用中,为每一个会话创建一个cart。

那么spring是怎么实现的呢?

spring定义了多种作用域,基于这些作用域可以创建不同的bean:

  • 单例(singleton):整个spring应用上下文,只创建一个bean实例
  • 原型(propotype):每次注入或者通过spring应用上下文获取,创建一个bean
  • 会话(session):web应用中,为每一个会话创建一个bean实例
  • 请求(request):web应用中,为每一个请求创建一个bean实例

创建一个会话域的bean

主要利用@Scope注解

@Component
@Scope(
    value=WebApplicationContext.SCOPE_SESSION,
    proxyMode=ScopedProxyMode.INTERFACES    
    )
public Cart cart{...}

将cart定义成一个session作用域的bean,这样在每一次会话中汇创建一个cart,做到一人一cart。

但用户希望使用一个cart时,spring不会将实际的cart bean注入给用户,他会把bean注入到一个cart的bean代理中。代理会将调用委托给会话作用域内真正的cart bean。

创建一个原型域的bean

两种方式,基于java代码和xml文件

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class Notepad {
  // the details of this class are inconsequential to this example
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean class="com.myapp.Notepad"
        scope="prototype" />

</beans>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值