spring的controller、service、dao都是默认singleton的,在singleton的模式下spring只会生成一个对象来处理并发的请求,例如:
@Controller @RequestMapping("test") public class Test { private int num = 0; @RequestMapping("test") @ResponseBody public int test(Model model){ return num++; } }
然后使用python模拟请求,结果可以看到多个相同的数字,比如0,1,2,2,3,4,5...如果在注解上标注@Scope("prototype"),那么spring将在每一个请求来后生成一个实例,结果为0,0,0,0,0,0...
有时我在资料中看到spring用ThreadLocal来解决多线程并发问题,但明显没有用在这些组件上。
明确提到使用了ThreadLocal的组件是事务管理,比如数据库的事务管理。