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。。。