Spring单例和多例

8 篇文章 0 订阅

疑惑

这是面试中老生常谈的问题,具体的话,类似
- spring中默认是单例还是多例?
- 什么时候使用单例?什么时候使用多例?
- springMVC的的controller是单例还是多例?(为什么是单例?)
- …
spring默认当然是单例,我想说的是第二条,什么时候使用单例?什么时候使用多例?

解惑

既然默认是单例,那就先说什么时候使用单例?
其实可以就第三个问题作为例子说?为什么SpringMVC中的控制器都是单例?首先需要想一想控制器一般是干什么的,在一个web网站中,控制器就是用来拦截请求的,然后处理请求,(当然一般的分层结构中,具体的处理方法在service层),那么控制器有必要是多例的吗?没有必要.
对于一个控制器来说,它拦截下来的请求,是具有相同访问路径的,尽管请求参数是不同的,但是请求参数决定的一般是实体的不同,和控制器本身并没有关系,所以控制器是单例的,否则一个请求就必须创建一个控制器实例,那对于高吞吐量的环境就不用玩了.
从这个例子就可以看出,什么样的bean可以是单例的,官方点的说法就是无状态的或不可变状态的bean,通俗说就是没有成员变量或者有不可变成员变量的类.这样的bean不具有状态,只提供处理业务请求的方法,按照这样的定义,在web中,从controller->service->dao应该都可以是单例的.
这里说一个题外话,如果在单例的类中,我一定要使用成员变量怎么办,其实也简单,只要解决好线程安全的问题就可以了,怎么解决,一个是使用ThreadLocal,另一个是将全局变量变成局部变量,这两种方法都是实现线程私有.
然后说说什么时候使用多例,上面其实已经说到了,实体类需要使用多例,因为实体类一般是表示状态的bean,就比如说一个电商网站中的商品类,那肯定不能是单例的.

我想了很久,使用多例的情况的确不多,这也就是为什么spring中默认是单例的,以前没有使用框架时,其实也没有想这么多,这时候想不用框架写servlet时,好像没有想过这个问题,也是因为学了servlet后就马上用spring了,不用框架的后端好像没写过完整的,这的确不好,一定要写一下,如果写过的话,也就没这么多问题了.

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值