Как именно обрабатывается аннотация Spring @Lazy? ⇐ JAVA
-
Anonymous
Как именно обрабатывается аннотация Spring @Lazy?
Возьмите добычу. Это BeanPostProcessor, который вставляет строку «мудрости» в поля, помеченные пользовательским @Wisdom. Обратите внимание на аннотацию @Lazy. Я сделал это так, чтобы Spring не жаловался в журналах, что зависимость wisdomProvider не обрабатывается всеми BeanPostProcessor (поскольку это требуется BeanPostProcessor сразу, до создания всех BeanPostProcessor)
@Component @Slf4j публичный класс WisdomBeanPostProcessor реализует BeanPostProcessor { частный окончательный WisdomProvider @Ленивый public WisdomBeanPostProcessor (WisdomProvider мудростипровайдер) { this.wisdomProvider = мудростьПровидер; } @Override public Object postProcessBeforeInitialization (Object bean, String beanName) выдает BeansException { Field[] поля = bean.getClass().getDeclaredFields(); for (Поле поля: поля) { Мудрость мудростьАннотация = field.getAnnotation(Wisdom.class); если (wisdomAnnotation != ноль) { поле.setAccessible(истина); ReflectionUtils.setField(поле, компонент, мудростьПровидер.getWisdom()); log.info("Класс WisdomProvider: " + WisdomProvider.getClass()); // печатает INFO [main]: класс мудрости: class jdk.proxy2.$Proxy36 } } вернуть боб; } } Что мне интересно, так это то, как обрабатывается аннотация @Lazy? Как видите, Spring, как и следовало ожидать, заменяет его каким-то прокси (при отсутствии @Lazy прокси не регистрируется). За прокси отвечает BeanPostProcessor. GPT упомянул некий LazyInitializationBeanPostProcessor, но, похоже, он это только что придумал. Я не смог найти упоминания об этом классе в Интернете (как и в проекте)
Итак, как именно обрабатывается @Lazy (например, каким BeanPostProcessor или BeanFactoryPostProcessor)?
Возьмите добычу. Это BeanPostProcessor, который вставляет строку «мудрости» в поля, помеченные пользовательским @Wisdom. Обратите внимание на аннотацию @Lazy. Я сделал это так, чтобы Spring не жаловался в журналах, что зависимость wisdomProvider не обрабатывается всеми BeanPostProcessor (поскольку это требуется BeanPostProcessor сразу, до создания всех BeanPostProcessor)
@Component @Slf4j публичный класс WisdomBeanPostProcessor реализует BeanPostProcessor { частный окончательный WisdomProvider @Ленивый public WisdomBeanPostProcessor (WisdomProvider мудростипровайдер) { this.wisdomProvider = мудростьПровидер; } @Override public Object postProcessBeforeInitialization (Object bean, String beanName) выдает BeansException { Field[] поля = bean.getClass().getDeclaredFields(); for (Поле поля: поля) { Мудрость мудростьАннотация = field.getAnnotation(Wisdom.class); если (wisdomAnnotation != ноль) { поле.setAccessible(истина); ReflectionUtils.setField(поле, компонент, мудростьПровидер.getWisdom()); log.info("Класс WisdomProvider: " + WisdomProvider.getClass()); // печатает INFO [main]: класс мудрости: class jdk.proxy2.$Proxy36 } } вернуть боб; } } Что мне интересно, так это то, как обрабатывается аннотация @Lazy? Как видите, Spring, как и следовало ожидать, заменяет его каким-то прокси (при отсутствии @Lazy прокси не регистрируется). За прокси отвечает BeanPostProcessor. GPT упомянул некий LazyInitializationBeanPostProcessor, но, похоже, он это только что придумал. Я не смог найти упоминания об этом классе в Интернете (как и в проекте)
Итак, как именно обрабатывается @Lazy (например, каким BeanPostProcessor или BeanFactoryPostProcessor)?
Мобильная версия