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 是单实例多线程的,当多个线程同时 访问同一个方法,是不能保证共享变量的线程安全性的。
经验分享 程序员 微信小程序 职场和发展