当多次访问Spring Singleton实例的同时

Bro*_*nuk 6 spring ioc-container

如果在spring配置中在单例范围内定义服务,如果多个用户同时尝试访问它(即作为依赖注入控制器)会发生什么?它应该引起冲突吗?或者IoC容器将保留稍后的呼叫,直到第一个完成?如果是这样,它应该会降低大型应用程序的性能,这听起来不对我.任何人都可以给我一个正确的答案吗?

顺便说一句,我记得,如果它不是单例,IoC容器将根据请求数量汇集几个实例.有人可以证实吗?

Sea*_*oyd 13

如果多个用户同时尝试访问它(即作为依赖注入您的控制器)会发生什么?

可以同时访问单个bean多次.这就是它始终必须是线程安全的原因

它应该引起冲突吗?

只有当你没有使它成为线程安全的时候

或者IoC容器将保留稍后的呼叫,直到第一个完成?

不,那太糟糕了


顺便说一句,我记得,如果它不是单例,IoC容器将根据请求数量汇集几个实例.有人可以证实吗?

Spring具有以下范围(请参阅Bean范围参考):

  • 单例(每个应用程序只管理一个实例)
  • 原型(每次注射的新实例)
  • session(每个HTTP会话一个实例,仅在Spring MVC中)
  • 请求(每个HTTP请求一个实例,仅在Spring MVC中)
  • 全局会话(每个全局HTTP会话一个实例,仅在基于portlet的Spring MVC中)

也:

从Spring 3.0开始,线程范围可用,但默认情况下未注册.有关更多信息,请参阅文档SimpleThreadScope.

您描述的是对象池.在Spring中,它将被实现为Prototype-scoped FactoryBean.在内部,它将使用像Apache Commons/Pool这样的库.


ska*_*man 5

单例就是这样——单例。一个实例由 Spring 上下文管理,所有请求同时通过该实例。由您决定是否使其线程安全。

如果您的 bean 不是线程安全的,请考虑使用非单例范围的 bean。Spring 允许您使用请求、会话和原型范围。