Spring bean的作用域有哪些?

spring 的 controller 是单例还是多例,怎么保证并发的安全。

spring bean 作用域有五种:

  • singleton:单例模式,当 spring 创建 applicationContext 容器的时候, spring 会欲初始化所有的该作用域实例,加上 lazy-init 就可以避免预处 理;

  • prototype:原型模式,每次通过 getBean 获取该 bean 就会新产生一个 实例,创建后 spring 将不再对其管理;


下面是在 web 项目下才用到的

  • request:搞 web 的大家都应该明白 request 的域了吧,就是每次请求都 新产生一个实例,和 prototype 不同就是创建后,接下来的管理, spring 依然在监听。
  • session:每次会话,同上。
  • global session:全局的 web 域,类似于 servlet 中的 application。 spring 中的 controller 默认是单例,也就是 singleton 模式了。
    所以如果 controller 中有一个私有变量 a,所有请求到同一个 controller 时,使 用的 a 变量都是共用的,即若是某个请求修改了这个变量 a,则,在别的请求 中能够读到这个修改的内容。 为了保证并发的安全,常见有两种解决方法。
  • 在 controller 中使用 ThreadLocal 变量。
  • 在 spring 配置文件 Controller 中声明为 scope=“prototype”,每次都创 建新的 controller,不再使用单例模式。 另外,Servlet 也不是线程安全的,Servlet 是单实例多线程的,当多个线程同时 访问同一个方法,是不能保证共享变量的线程安全性的。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值