Если вы просто хотите настроить инициализацию определенных 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);
}
}