get it [springmvc controller 单例说明以及多例切换]

spring的bean作用域种类:

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

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

3)request:每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听

4)session:每次会话,同上

5)global session:全局的web域,类似于servlet中的application

 

为什么spring默认推荐singleton呢?

高并发下能极大的节省资源,提高服务抗压能力。采用单例模式的好处:

  • 为了性能,单例不用每次都new。
  • 默认场景不需要多例(提供多例转换)。

单例模式下容易出现的问题就是controller中定义很多的属性,那么单例肯定会出现竞争访问,不同用户共享数据变量是不安全的。因此:

  • 不要在controller中定义成员变量。
  • 万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式。
  • 在Controller中使用ThreadLocal变量

怎样切换多例呢?

在class上面加一个@Scope("xxx"),xxx 的值为bean作用域如:request、prototype。。。

你可能感兴趣的:(get it [springmvc controller 单例说明以及多例切换])