https://open.163.com/newview/movie/free?pid=XG9JH234S&mid=PG9JI0AQT

答案:不是线程安全的

Spring 中的 Bean 默认是单例模式的,框架并没有对 bean 进行多线程的封装处理。

如果 Bean 是有状态的 那就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变 bean 的作用域,把 "singleton" 改为 "protopyte" 这样每次请求 Bean 就相当于是 new Bean() 这样就可以保证线程的安全了。

Dao 会操作数据库Connection ,Connection 是带有状态的,比如说数据库事务,Spring的事务管理器使用 ThreadLocal 为不同线程维护了一套独立的 connection 副本,保证线程之间不会互相影响(Spring 是如何保证事务获取同一个Connection的)

不要在 bean 中声明任何有状态的实例变量或类变量,如果必须如此,那么就使用 Threadlocal 把变量变为线程私有的,如果bean的实例变量或类变量需要在多个线程之间共享,那么就只能使用 synchronized、lock、CAS等这些实现线程同步的方法了

Spring框架中的Bean是线程安全的吗?