Bean 的分类

Bean 分为有状态的 bean 和无状态的 bean

  • 有状态:指对象中存在有实例变量(成员变量),可以保存数据,是非线程安全的
  • 无状态:指对象中不存在实例变量(成员变量),即不能保存实例数据,这样的bean是多线程安全的,可以在多线程环境下进行共享

Spring 的线程安全问题

在 spring 中,bean 默认是单实例,即 ioc 容器中一个类只会存在一个实例对象

  • 绝大多数的 bean 是无状态的,如 controller、sevice、dao 中的这些类通常不含有成员变量,即为无状态的 bean,因此在多线程环境下不会产生线程安全问题(因此要避免在这些类中定义成员变量)
  • 对于有状态的 bean
    • Spring 采用 ThreadLocal 进行处理,使它们成为线程安全的 bean
    • 或者使用原型模式 prototype,即每次使用时都会生成一个对象,解决多线程环境下的线程安全问题

总结:

  • 无状态的 bean 适合单例模式,可以在多线程环境下共享实例,提高性能
  • 有状态的 bean 适合原型模式 prototype,保证每次请求都会获取一个新的 bean