spring中bean的作用域问题

首先先说明一下spring中bean的几种作用域:
spring中默认所有的bean都是作为单例(singleton)的形式创建的。不管bean被注入到其他的bean多少次,每次注入的都是同一个实例。

大多数情况下,单例bean还是一个很理想的方案。但有时它也不是理想的方案。举一个最简单的例子吧,比如大家所熟悉的淘宝、京东中的购物车,如果bean是单例的,那成千上万个用户使用的都是同一个购物车的bean,想想可能吗?不可能,spring早已经为我们想好了方案。现在我说下sping定义的多种作用域。

@Scope(value=ConfigurableBeanFactory.SCOPE_PROTOTYPE)多例,在每次注入的时候回自动创建一个新的bean实例

@Scope(value=ConfigurableBeanFactory.SCOPE_SINGLETON)(默认)单例模式,在整个应用中只能创建一个实例

@Scope(value=WebApplicationContext.SCOPE_GLOBAL_SESSION)全局session

@Scope(value=WebApplicationContext.SCOPE_APPLICATION)在一个web应用中只创建一个实例

@Scope(value=WebApplicationContext.SCOPE_REQUEST)在一个请求中创建一个实例

@Scope(value=WebApplicationContext.SCOPE_SESSION)每次创建一个会话中创建一个实例

然后需要注意的就是当我们的bean使用的作用域为session或者request时,该bean的实例在第一次请求时才创建,于是当我们将其注入到单例bean中时便会报错:在spring容器中未找到需要注入的bean。为了解决此问题便需要用到 proxyMode属性,当 proxyMode=ScopedProxyMode.INTERFACES(基于接口代理)时,项目启动去注入这个bean时不会将实际的bean注入到单例bean中,而是注入他的代理,只有当单例bean真正的调用了该bean中的方法,才会调用该bean。此外如果被代理类是普通类时,将代理改为 proxyMode=ScopedProxyMode.TARGET_CLASS(基于类)即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值