【问题标题】:Instanciate a bean with singleton scope实例化具有单例范围的 bean
【发布时间】:2017-03-26 11:05:22
【问题描述】:

下面的bean什么时候会被实例化?

<bean id="a" class="Someclass" lazy-init="true" scope="singleton"/>

在这种情况下,Spring 是否忽略“lazy-init”属性(因为我们使用单例范围)?

加载 bean 定义时将创建一次新实例。有人可以确认吗?

谢谢。

【问题讨论】:

    标签: java spring singleton


    【解决方案1】:

    这个

    <bean id="a" class="Someclass" lazy-init="true" scope="singleton"/>
    

    还有这个

    <bean id="a" class="Someclass" lazy-init="true"/>
    

    都是一样的。 spring bean 的默认作用域是单例。所以它绝对不会忽略这个属性。

    lazy-init="true" 不会在启动时创建您的 bean。只有在请求时才会创建您的 bean。

    【讨论】:

      【解决方案2】:

      在这种情况下 Spring 是否会忽略“lazy-init”属性(因为我们 使用单例范围)?

      不,它不会忽略,对象只会在第一次访问时创建,而不是在容器启动时创建。

      当 bean 定义完成时,将创建一个新实例 加载。有人可以确认吗?

      不,只有在实际需要 bean 时才会创建实例。

      您可以从here 参考 spring doc 中的同一点,下面是文本(强调我的)

      一个惰性初始化的 bean 告诉 IoC 容器创建一个 bean 实例在第一次请求时,而不是在启动时但是,当延迟初始化的 bean 是未延迟初始化的单例 bean 的依赖项时,ApplicationContext 会在启动时创建延迟初始化的 bean,因为它必须满足单例的依赖项。延迟初始化的 bean 被注入到其他未延迟初始化的单例 bean 中。

      【讨论】:

        猜你喜欢
        • 2017-01-22
        • 1970-01-01
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 2014-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多