【问题标题】:Spring default behavior for lazy-init惰性初始化的 Spring 默认行为
【发布时间】:2013-02-12 03:03:08
【问题描述】:

我是spring的初学者,ESP控制反转。我很困惑理解以下之间的区别

 <bean id="demo" class="Demo" lazy-init="false"/>
 <bean id="demo" class="Demo" lazy-init="true"/>
 <bean id="demo" class="Demo" lazy-init="default"/>

据我了解:lazy-init=false 在启动时创建 bean,lazy-init=true 不在启动时创建 bean,而是根据对特定 bean 的请求创建 bean。 在这里纠正我,如果我的解释是错误的。

lazy-init 的默认行为到底是什么?它将如何实例化?

【问题讨论】:

    标签: spring spring-ioc


    【解决方案1】:

    bean 上的lazy-init="default" 设置仅指封闭beans 元素的default-lazy-init 属性设置的内容。 default-lazy-init 的隐含默认值为false

    如果没有在 bean 上指定 lazy-init 属性,它总是被急切地实例化。

    【讨论】:

      【解决方案2】:

      默认行为是假的:

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

      I suggest reading up

      【讨论】:

      • GWT4Ever:如果默认行为是假的,为什么要指定lazy-init="false",尽管他们可以使用lazy-init="default",对吗?为什么两个单独的值 false,如果它们的行为相同则默认?
      • 这是Zagyi的回答,链接也有。
      • 更新文档可用here
      • 我遇到了这个问题,因为自我注入(需要弹簧重试,因为被重试的方法不是其他人调用的方法)。如果自注入字​​段没有标记@Lazy,@SpyBean 显然会失败。
      【解决方案3】:

      lazy-init 是 bean 的属性。 lazy-init 的值可以是 true 和 false。 如果lazy-init 为真,那么当对bean 发出请求时,该bean 将被初始化。这个bean在spring容器初始化的时候不会被初始化 和 如果lazy-init 为false,则bean 将使用spring 容器初始化进行初始化。

      【讨论】:

      • 可以为文件中的所有 bean 设置此项:springframework.org/schema/beans" ... default-lazy-init="true" >跨度>
      【解决方案4】:

      对于那些来到这里并使用 Java 配置的人,您可以使用如下注释将 Bean 设置为惰性初始化:

      在配置类中:

      @Configuration
      // @Lazy - For all Beans to load lazily
      public class AppConf {
      
          @Bean
          @Lazy
          public Demo demo() {
              return new Demo();
          }
      }
      

      对于组件扫描和自动装配:

      @Component
      @Lazy
      public class Demo {
          ....
          ....
      }
      
      @Component
      public class B {
      
          @Autowired
          @Lazy // If this is not here, Demo will still get eagerly instantiated to satisfy this request.
          private Demo demo;
      
          .......
       }
      

      【讨论】:

        【解决方案5】:

        当我们在元素中使用 lazy-init="default" 作为属性时,容器会获取 default-lazy-init="true|false" 指定的值元素的strong>属性并将其用作lazy-init="true|false"。

        如果元素中不存在 default-lazy-init 属性,则元素中的lazy-init="default" 将表现得如同lazy-init-"false"。

        【讨论】:

        • 可以为文件中的所有 bean 设置此项:springframework.org/schema/beans" ... default-lazy-init="true" >跨度>
        猜你喜欢
        • 1970-01-01
        • 2017-12-10
        • 2021-11-21
        • 1970-01-01
        • 2020-02-24
        • 1970-01-01
        • 2014-05-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多