Spring默认情况下就是单例的
但是可以设置 @Scope 的值为 prototype 将Bean设置为多例的,如下
@Service @Scope("prototype") public class UserServiceImpl implements UserService { }
那么单例Bean是线程安全的吗?
不是
但是
看以下代码
有个成员变量 count ,成员变量是 需要考虑线程安全问题的
userService 是无状态的, 因此无需考虑线程安全问题
getById中的参数id是形参,形参是不需要考虑线程安全的
@Controller @RequestMapping("/user") public class UserController { private int count; @Autowired private UserService userService; @GetMapping("/getById/{id}") public User getById(@PathVariable("id") Integer id){ count++; System.out.println(count); return userService.getById(id); } }
因此实际上,单例Bean在某种程度上又是线程安全的
因此在开发过程中尽量不要定义可修改的成员变量