@Lazy vs "BeanFactoryPostProcessor" Spring Boot - PullRequest
0 голосов
/ 21 июня 2019

Я плохо разбираюсь в английском.И я новичок в "Весенней загрузке".Пожалуйста, поймите.

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

У меня есть вопрос в этой статье.

В письменном виде ... "Возможно включить лазерную инициализацию в любой версии Spring Boot, если выпачкаете руки и пишите BeanFactoryPostProcessor. "

Я хотел бы знать, в чем разница с использованием" Lazy Annotation ".

  1. Использование "@Lazy Annotation"
  2. "... dirty и написать BeanFactoryPostProcessor."

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Если вы просто хотите настроить инициализацию определенных bean-компонентов, вы можете аннотировать эти bean-компоненты, используя @Lazy. Это удобно, но скорее статично. Он не может обрабатывать случаи, когда вы хотите иметь более динамичное поведение, чтобы настроить некоторые bean-компоненты на ленивость в зависимости от определенных условий.

BeanFactoryPostProcessor предоставляет способ изменить определения bean-компонентов после инициализации контекста Spring, что означает, что мы можем использовать его для настройки программных компонентов, которые будут ленивыми программно.

Все бины по умолчанию не ленивы. Поэтому, если мы хотим настроить все bean-компоненты на ленивость, чтобы увеличить время запуска Spring, мы должны вручную аннотировать все bean-компоненты с помощью @Lazy. Это не очень удобно, если у нас много bean-компонентов. Так что в статьях упоминается, что в SpringBoot 2.2 появится новая функция, позволяющая сделать все bean-компоненты ленивыми по умолчанию, так что нам не нужно вручную аннотировать @Lazy для всех bean-компонентов. За сценой он делает это, регистрируя этот 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);
    }
}
0 голосов
/ 21 июня 2019

Если BeanFactoryPostProcessor, вы можете настроить определение компонента (НЕ экземпляр экземпляра).Одним из изменений является свойство laziness:

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

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

           beanFactory.getBeanDefinition("YourBeanName").setLazyInit(true);  
    }
}

Это эквивалентно установке @Lazy при инициализации YourBeanName bean

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...