【问题标题】:Can the object created in IoC container be called Singleton. If not - why?在 IoC 容器中创建的对象可以称为 Singleton。如果不是 - 为什么?
【发布时间】:2011-04-05 16:07:35
【问题描述】:

在IOC容器中创建的对象是否可以称为Singleton if yes 为什么如果不是为什么?

谁能用简单的话详细解释一下 IOC conatiner 如何准确地管理对象..

【问题讨论】:

    标签: spring dependency-injection ioc-container


    【解决方案1】:

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

    Singleton 有其有意义的作用域,spring 单例作用域就是 spring ioc 容器。而经典的单例有意义的作用域是 ClassLoader。你可以在这里找到更多关于这些单例的区别:A spring singleton is not a singleton

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

    【讨论】:

    • 感谢您的文章。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 请求范围意味着对象是根据 http 请求创建的,会话意味着对象是每个用户的。我说对了吗??
    【解决方案3】:

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

    Read this,来自 Spring 参考。

    谁能详细解释一下 简单的话 IOC 容器到底如何 管理对象..

    Read this,来自 Spring 参考。

    【讨论】:

      【解决方案4】:

      我使用更通用的单例定义:

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

      这个作用域是传统单例定义中的ClassLoader,但其他可能的作用域是:

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

      (我真的很喜欢 Seam 方法 Component.getInstance(Class, ScopeType),它可以让你选择你想要单例的作用域。)

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 也许是这样,但如果你不用一句话来描述它,我永远不会点击那个链接......
        猜你喜欢
        • 2020-02-05
        • 1970-01-01
        • 2014-04-29
        • 2010-09-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多