【问题标题】:How to activate lazy instantiation for all spring beans如何为所有 Spring bean 激活延迟实例化
【发布时间】:2015-05-13 10:36:48
【问题描述】:

在一个项目中有几个applicationContext.xml 文件。已定义的 bean 没有任何惰性定义。然后所有单例范围的 bean 在运行时实例化。
哎呀。这对开发阶段非常不利。服务器启动需要将近 2 分钟的时间。现在我会知道在春季有没有针对主动惰性实例化的解决方案。例如 web.xml 中设置 bean default-lazy-init="true" 的配置。

【问题讨论】:

  • 你已经很好地提出了这个问题,脱帽致敬......:P

标签: spring


【解决方案1】:

实现一个自定义的 BeanFactoryPostProcessor,将惰性设置为 true,例如:

public class BeanFactoryPostProcessorImpl implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(final ConfigurableListableBeanFactory beanFactory) throws BeansException {

        for (String beanName : beanFactory.getBeanDefinitionNames()) {
            beanFactory.getBeanDefinition(beanName).setLazyInit(true);  
        }
    }
}

要使其正常工作,您需要做的就是将其作为标准 bean 添加到您的应用程序上下文中:

ApplicationContext 将检测部署到其中的任何 bean 它实现了 BeanFactoryPostProcessor 接口,以及 自动将它们用作 bean factory 后处理器,在 适当的时候。除了部署之外什么都不需要做 这些后处理器以与任何其他 bean 类似的方式。

【讨论】:

    【解决方案2】:

    applicationContext.xml 文件中,您可以在<beans/> 元素上添加值为truedefault-lazy-init 属性。见reference

    【讨论】:

    • 我有很多applicationContext.xml,编辑所有这些并不好。例如假设您有 2000 个applicationcontext.xml。那么您将编辑所有这些?
    • 所以也许实现BeanFactoryPostProcessorpostProcessBeanFactoryfor (String beanName : beanFactory.getBeanDefinitionNames()) {beanFactory.getBeanDefinition(beanName).setLazyInit(true);}
    • 谢谢。但我怎样才能注册它。我是否只是创建一个实现BeanFactoryPostProcessor 的类,或者之后我应该在 web.xml 或其他配置文件中注册它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-11-26
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2016-05-09
    相关资源
    最近更新 更多