【发布时间】:2011-04-05 16:07:35
【问题描述】:
在IOC容器中创建的对象是否可以称为Singleton if yes 为什么如果不是为什么?
谁能用简单的话详细解释一下 IOC conatiner 如何准确地管理对象..
【问题讨论】:
标签: spring dependency-injection ioc-container
在IOC容器中创建的对象是否可以称为Singleton if yes 为什么如果不是为什么?
谁能用简单的话详细解释一下 IOC conatiner 如何准确地管理对象..
【问题讨论】:
标签: spring dependency-injection ioc-container
你可以说弹簧单例不是单例。
Singleton 有其有意义的作用域,spring 单例作用域就是 spring ioc 容器。而经典的单例有意义的作用域是 ClassLoader。你可以在这里找到更多关于这些单例的区别:A spring singleton is not a singleton。
Spring 在 hashmap(Singleton Cache)中管理它的单例。当你从 spring ioc 容器中获取一个 bean 时,它首先检查该 bean 是否已经存在于单例缓存中,如果存在,则从单例缓存中返回该 bean
【讨论】:
Spring(和其他 ioc 容器)提供不同的作用域。其中一个作用域是单例 - 即容器只实例化对象一次并且只提供/注入一个实例。单例是默认范围,因此从容器的角度来看,大多数 bean 确实是单例——即它们只有一个实例。
但是,还有其他范围,例如 prototype 或基于 Web 的 request 和 session。
在管理 bean 中,容器执行以下操作:
@PostConstruct 和@PreDestroy 方法(或init 和destroy 方法,通过任何可用方式配置)注意:您可以实例化多个定义为单例 bean 的类的对象。容器只实例化对象一次,但你的代码不限于实例化它多次。
【讨论】:
我使用更通用的单例定义:
Singleton 是一个对象 保证在给定的内部是唯一的 范围。
这个作用域是传统单例定义中的ClassLoader,但其他可能的作用域是:
(我真的很喜欢 Seam 方法 Component.getInstance(Class, ScopeType),它可以让你选择你想要单例的作用域。)
【讨论】:
您可能会发现this Google Groups thread 很有用。
【讨论】: