【问题标题】:@Lazy vs "BeanFactoryPostProcessor" Spring Boot@Lazy 与“BeanFactoryPostProcessor”Spring Boot
【发布时间】:2019-06-21 02:04:20
【问题描述】:

我英语不好。我是“Spring Boot”初学者。请理解。

https://spring.io/blog/2019/03/14/lazy-initialization-in-spring-boot-2-2#enabling-lazy-initialization

我在这篇文章中有一个问题。

在写作中... “如果你手忙脚乱并编写一个 BeanFactoryPostProcessor,则可以在任何版本的 Spring Boot 中启用激光初始化。”

我想知道使用“Lazy Annotation”有什么区别。

  1. 使用“@Lazy 注释”
  2. "...脏了,写个BeanFactoryPostProcessor。"

【问题讨论】:

    标签: spring-boot


    【解决方案1】:

    如果您只想将某些 bean 配置为延迟初始化,您可以使用 @Lazy 注释这些 bean。它很方便但相当静态。它无法处理如果您希望具有更多动态行为来根据某些条件将某些 bean 配置为惰性的情况。

    BeanFactoryPostProcessor 提供了一种在 Spring 上下文初始化后修改 bean 定义的方法,这意味着我们可以使用它以编程方式配置哪些 bean 是惰性的。

    默认情况下,所有 bean 都不是惰性的。所以如果我们想把所有的bean都配置成懒惰以增加Spring的启动时间,我们必须手动给所有的bean注解@Lazy。如果我们有很多bean就不那么方便了。所以文章提到的是,在 SpringBoot 2.2 中将有一个新特性,让所有 bean 默认为惰性,这样我们就不需要为所有 bean 手动注释 @Lazy。在幕后,它通过注册这个BeanFactoryPostProcessor 来实现它,它只需执行以下操作:

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        for (String name : beanFactory.getBeanDefinitionNames()) {
            BeanDefinition beanDefinition = beanFactory.getBeanDefinition(name);
            if (beanDefinition instanceof AbstractBeanDefinition) {
                Boolean lazyInit = ((AbstractBeanDefinition) beanDefinition).getLazyInit();
                if (lazyInit != null && !lazyInit) {
                    continue;
                }
            }
            beanDefinition.setLazyInit(true);
        }
    }
    

    【讨论】:

    • 谢谢。感谢您的友好解释。
    【解决方案2】:

    如果BeanFactoryPostProcessor 您可以调整 bean 定义(不是 bean 实例)。其中一项调整是 laziness 属性:

    public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    
        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    
               beanFactory.getBeanDefinition("YourBeanName").setLazyInit(true);  
        }
    }
    

    相当于在YourBeanNamebean的初始化上设置@Lazy

    【讨论】:

    • 谢谢。感谢您的友好解释。
    猜你喜欢
    • 2017-05-31
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多