【问题标题】:In spring context, is initialization and instantiation the same?在spring上下文中,初始化和实例化是否相同?
【发布时间】:2018-12-13 03:35:22
【问题描述】:

用编程语言来说, 字符串 str = new String(); // 实例化 str = "你好"; // 初始化

现在,在 Spring 中,有延迟初始化的概念。这是否意味着他们的对象被延迟实例化或被延迟初始化?

或者,名称lazy-init 属性或@lazy 注释是否具有误导性,因为它实际上是延迟实例化?

附:我了解到,从 4.3 开始,@lazy 既可用于延迟初始化,也可用于延迟依赖解析。

【问题讨论】:

  • 实例化是 bean 初始化过程的一部分。这是第一步,在注入依赖项和执行初始化回调(@PostConstructInitializingBean 以及几个感知接口)之前。

标签: spring dependency-injection lazy-initialization


【解决方案1】:

关于你的例子

String str = new String();
str = "hello";

涉及实例化和初始化。第一行实例化一个字符串并用一个空字符串初始化它,这意味着如果你执行System.out.println,你将看到空而不是null

第二行在字符串池中实例化一个String 常量,并用该值初始化str

对于您关于 Spring Lazy Initialization 的问题,Spring Context 使用延迟初始化来加快启动时间。在 Spring 中,一个 Bean 仅在第一次从 Spring 上下文中请求时才被初始化。记住初始化总是在实例化之后发生。

【讨论】:

  • 那么,当我们说惰性单例或原型时,那么实际上是指这些对象是在创建上下文时创建的,但只有在实际引用它们时才初始化?
【解决方案2】:

根据this(Spring 文档),@Lazy 涉及延迟 bean 的实例化和初始化:

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

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 2017-03-17
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2013-10-18
    相关资源
    最近更新 更多