【问题标题】:When does Spring create instances of objects that are injectedSpring何时创建注入对象的实例
【发布时间】:2011-01-06 06:40:57
【问题描述】:

Spring 执行 DI 并创建对象,因此您的程序无需担心创建对象。 但这里的问题是何时创建注入对象的实例。是在主程序使用实例时还是在创建主程序实例时。

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    在上下文启动时,上下文中的所有 bean 都会被实例化、注入和初始化。当从上下文中检索到第一个 bean 时,所有 bean 都可以使用了。

    有两件事可以防止 bean 在上下文启动时被初始化:

    • 一个 bean 的 bean 使用 scope="xyz" 属性配置了 different scope(例如 prototyperequestsession
    • 一个 bean 已被标记为 lazy-init="true",在这种情况下,它只会在明确要求它或需要它作为其他 bean 的依赖项时才会被实例化。

    【讨论】:

    • 感谢 skaffman,这澄清了我的疑问。因此,由程序员决定是否需要延迟初始化或预先初始化 bean。这可能是非常主观的,但您能否告诉我在这种情况下遵循的任何最佳做法。
    • 这完全是主观的,是的,但软件构建的其余部分也是如此。这没有什么不同。但是您的默认位置应该是非惰性的,并且是默认范围。如果你有充分的理由,只做一个豆子。
    • 我想说你可以(并且应该)客观地做出这个决定......就像软件工程中的许多其他事情一样。我们往往没有足够的信息或脑力来做出客观的决定,这只是重大决策。
    • 自上次在此线程上发帖以来已经超过 3 年了,我只是在寻找类似问题时跳上它。我的一个查询是,在上下文实例化时,它只会创建一个 bean 对象(如果我错了,请纠正我)。如果我在我的代码中自动装配同一个 bean 两次,第二个对象会被懒惰地实例化吗?
    【解决方案2】:

    在评论中,OP 写道:

    因此,由程序员决定是否需要延迟初始化或预先初始化 bean。这可能是非常主观的,但您能否告诉我在这种情况下遵循的任何最佳实践。

    是的,由程序员(或系统集成商)决定。

    实际上并没有任何“最佳实践”规则来决定。这样想:

    • 如果你声明一个 bean 为延迟初始化,而它总是需要被实例化,你可能会使启动过程变慢。

    • 如果在不总是需要 bean 时将 bean 声明为急切初始化,则会使启动过程变慢,并可能使用更多内存。在最坏的情况下,创建不必要的 bean 甚至可能导致启动失败。

    简而言之,您需要了解您的应用程序。

    【讨论】:

      【解决方案3】:

      http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lazy-init

      默认情况下,ApplicationContext 实现会在初始化过程中急切地创建和配置所有单例 bean。通常,这种预实例化是可取的,因为配置或周围环境中的错误会立即发现,而不是几小时甚至几天之后。当这种行为不可取时,您可以通过将 bean 定义标记为惰性初始化来防止单例 bean 的预实例化。延迟初始化的 bean 告诉 IoC 容器在第一次请求时创建一个 bean 实例,而不是在启动时。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-17
        • 1970-01-01
        • 2019-07-28
        • 2016-04-29
        相关资源
        最近更新 更多