Spring管理的对象基本都应该是无状态的  ,spring单例 线程安全

 

Bean  也是运行于多线程的环境下。在绝大多数情况下, Spring  的  Bean  都是单实例的( singleton ),单实例  Bean 

 

Spring的 DAO

 

ThreadLocal在 Spring 中发挥着重要的作用,在管理 request 作用域的 Bean 、事务管理、任务调度、 AOP

 

当使用ThreadLocal 维护变量时, ThreadLocal

 

ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单:在 ThreadLocal 类中有一个 Map ,用于存储每一个线程的变量副本, Map

 

Spring使用 ThreadLocal

我们知道在一般情况下,只有无状态的Bean 才可以在多线程环境下共享,在 Spring 中,绝大部分 Bean 都可以声明为 singleton 作用域。就是因为 Spring 对一些 Bean (如 RequestContextHolder 、 TransactionSynchronizationManager 、 LocaleContextHolder 等)中非线程安全状态采用 ThreadLocal 进行处理,让它们也成为线程安全的状态,因为有状态的 Bean

 

 

singleton作用域

当一个bean 的作用域设置为 singleton ,那么 Spring IOC 容器中只会存在一个共享的 bean 实例,并且所有对 bean 的请求,只要 id 与该 bean 定义相匹配,则只会返回 bean 的同一实例。换言之,当把一个 bean 定义设置为 singleton 作用域时, Spring IOC 容器只会创建该 bean 定义的唯一实例。这个单一实例会被存储到单例缓存( singleton cache )中,并且所有针对该 bean 的后续请求和引用都将返回被缓存的对象实例,这里要注意的是 singleton 作用域和 GOF 设计模式中的单例是完全不同的,单例设计模式表示一个 ClassLoader 中只有一个 class 存在,而这里的 singleton 则表示一个容器对应一个 bean ,也就是说当一个 bean 被标识为 singleton 时候, spring 的 IOC 容器中只会存在一个该 bean

配置实例:

<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>

或者

<bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>