【问题标题】:Spring framework default-lazy-init all beansSpring框架default-lazy-init所有bean
【发布时间】:2011-05-26 14:15:49
【问题描述】:

是否有一个 spring 属性可以延迟初始化 spring 框架加载的所有 bean?

我知道这些属性

 - lazy-init="true"
 - default-lazy-init="true"

但是有多个 spring config xml 文件,有些被打包在 jar 中,所以不能随意更改 标签。

还有其他方法可以通过配置解决这个问题吗?还是以编程方式?

【问题讨论】:

  • 我真希望我能做到这一点。我们正在自动装配很多 bean,因此需要 15-20 秒来预实例化它们。我很想在我的开发者机器上更改它以缩短启动时间,但在生产服务器上保持不变。

标签: spring lazy-loading javabeans


【解决方案1】:

没有扩展 Spring bean 加载器,我不知道。

【讨论】:

    【解决方案2】:

    你也可以使用@Lazy注解,不过和你上面说的一样。

    【讨论】:

      【解决方案3】:

      根据 java doc,这应该可以工作(虽然看起来不太好)

      if (context.getBeanFactory() instanceof DefaultListableBeanFactory)
          {
              ((DefaultListableBeanFactory) context.getBeanFactory()).setAllowEagerClassLoading(false);
          }
      

      【讨论】:

        【解决方案4】:

        我已经在我的公司实现了这个,不得不扩展一些 spring 类。这并不容易,但我们在每次启动 tomcat 时都获得了大约 20 秒的收益。不幸的是,对于隐私条款,我无法显示代码,但请查看 ClassPathBeanDefinitionScanner、DefaultBeanDefinitionDocumentReader、ContextNamespaceHandler 和 ComponentScanBeanDefinitionParser 类。

        【讨论】:

        【解决方案5】:

        从 Spring Boot 2 开始,您可以使用 spring.main.lazy-initialization 属性在整个应用程序中配置延迟初始化。

        将属性值设置为true意味着应用程序中的所有bean都将使用延迟初始化。

        application.yaml

        spring:
          main:
            lazy-initialization: true
        

        或在 application.properties

        spring.main.lazy-initialization=true
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-12
          • 2012-12-12
          • 1970-01-01
          • 1970-01-01
          • 2019-11-24
          • 1970-01-01
          相关资源
          最近更新 更多