可以将在IoC容器中创建的对象称为Singleton。如果没有 - 为什么?

时间:2010-08-30 08:53:05

标签: spring dependency-injection ioc-container

可以将在IOC容器中创建的对象称为Singleton,如果是,为什么如果没有原因?

任何人都可以用简单的语言详细解释我IOC conatiner如何精确管理对象..

5 个答案:

答案 0 :(得分:6)

你可以说弹簧单身不是单身。

Singleton有其有意义的范围,spring singleton范围是spring ioc容器。经典单身人士的有意义范围是ClassLoader。您可以在此处找到有关这些单身人士之间区别的更多信息:A spring singleton is not a singleton

Spring在hashmap(Singleton Cache)中管理它的单例。当你从spring ioc容器中获取bean时,它首先检查bean是否已经存在于单例缓存中,如果是,它会从单例缓存中返回bean

答案 1 :(得分:1)

Spring(和其他ioc容器)提供不同的范围。其中一个范围是单例 - 即容器仅对对象进行一次实例化,并且只给出/注入一个实例。 Singleton是默认范围,因此从容器的角度来看,大多数bean确实是单例 - 即它们只有一个实例。

但是,还有其他范围,例如prototype或基于网络的requestsession

管理 bean中,容器执行以下操作:

  • 调用@PostConstruct@PreDestroy方法(或init和destroy方法,由任何可用方法配置)
  • 注入所有已定义的依赖项(=将容器中存在的其他bean设置为此bean的字段)
  • 围绕bean方法创建AOP方面

注意:您可以实例化定义为singleton bean的类的多个对象。容器仅对对象进行一次实例化,但您的代码不限于多次实例化它。

答案 2 :(得分:0)

您可能会发现this Google Groups thread有用。

答案 3 :(得分:0)

  

可以在IOC中创建对象   容器可以称为Singleton if   是的,为什么如果没有原因?

来自Spring Reference的

Read this

  

任何人都可以详细解释我   简单的说明IOC conatiner究竟如何   管理对象..

来自Spring Reference的

Read this

答案 4 :(得分:0)

我使用了更为通用的Singleton定义:

  

Singleton是一个对象   保证在给定的内部是唯一的   范围。

此范围是传统单例定义中的ClassLoader,但其他可能的范围是:

  • 应用程序(可能是聚集的,因此经典的Singleton无济于事)
  • HTTP会话
  • 线程(通过ThreadLocals实现)
  • HTTP请求等。

(我非常喜欢Seam方法Component.getInstance(Class, ScopeType),它允许您选择想要单身的范围。)