SpringBean作用域有:
singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上 lazy-init 可以避免预处理
prototype:原型模式,每次通过getBean()方法获取bean就会新产生一个实例,创建后spring将不再对其管理
equest:每次请求都新产生一个实例
session: 每次会话,只要是同一个会话,就使用同一个实例
global session: 全局的web域,类似于servlet中的application
Controller默认是单例的
正因为单例,所以Controller不是线程安全的。
示例:创建SpringBoot项目,然后在其中创建如下所示的Controller:
@RestController
public class TestController {
private int num = 0;
@GetMapping("/fun")
public void fun(HttpServletRequest request) {
final String sid = request.getSession().getId();
System.out.println(sid + " " + ++num);
}
}
启动项目,分别在两个不同的浏览器中请求fun,发现控制台输出结果:
结论:不同的访问者的请求,结果是相互干扰的,线程不安全。
示例:为Controller指定作用域prototype
@RestController
@Scope("prototype")
public class TestController {
private int num = 0;
@GetMapping("/fun")
public void fun(HttpServletRequest request) {
final String sid = request.getSession().getId();
System.out.println(sid + " " + ++num);
}
}
启动项目,分别在两个不同的浏览器中请求fun,发现控制台输出结果:
结论:指定了@Scope(“prototype”)后,不同请求者之间不再会产生影响了。
原文链接:https://blog.csdn.net/lianghecai52171314/article/details/120126488