Spring bean的作用域有哪些?

spring 的 controller 是单例还是多例,怎么保证并发的安全。

spring bean 作用域有五种:

  • singleton:单例模式,当 spring 创建 applicationContext 容器的时候, spring 会欲初始化所有的该作用域实例,加上 lazy-init 就可以避免预处 理;

  • prototype:原型模式,每次通过 getBean 获取该 bean 就会新产生一个 实例,创建后 spring 将不再对其管理;


下面是在 web 项目下才用到的

  • request:搞 web 的大家都应该明白 request 的域了吧,就是每次请求都 新产生一个实例,和 prototype 不同就是创建后,接下来的管理, spring 依然在监听。
  • session:每次会话,同上。
  • global session:全局的 web 域,类似于 servlet 中的 application。 spring 中的 controller 默认是单例,也就是 singleton 模式了。
    所以如果 controller 中有一个私有变量 a,所有请求到同一个 controller 时,使 用的 a 变量都是共用的,即若是某个请求修改了这个变量 a,则,在别的请求 中能够读到这个修改的内容。 为了保证并发的安全,常见有两种解决方法。
  • 在 controller 中使用 ThreadLocal 变量。
  • 在 spring 配置文件 Controller 中声明为 scope=“prototype”,每次都创 建新的 controller,不再使用单例模式。 另外,Servlet 也不是线程安全的,Servlet 是单实例多线程的,当多个线程同时 访问同一个方法,是不能保证共享变量的线程安全性的。

你可能感兴趣的:(框架,Spring,Bean,作用域)