Почему не вызывается @PostConstruct в bean-компоненте, реализованном BeanFactoryPostProcessor и ApplicationContextAware?

Я попытался создать компонент Spring и записать все возможные этапы его жизненного цикла.

Но я заметил, что в этом случае метод, аннотированный @PostConstruct, не вызывается.

Я полагаю, это происходит потому, что BeanFactoryPostProcessor и ApplicationContextAware заставляют контейнер создать его экземпляр как можно раньше, но я точно не знаю.

Не могли бы вы мне объяснить, пожалуйста?

Обратите внимание на приведенный ниже фрагмент кода:

public class F implements BeanFactoryPostProcessor, ApplicationContextAware {

        @PostConstruct
        private void postConstruct() {
            System.out.println("Hi from postContruct()");
        }

        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("Hi from setApplicationContext()");
        }

        @Override
        public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
            System.out.println("Hi from postProcessBeanFactory()");
        }
}

И вывод:

Hi from setApplicationContext()
Hi from postProcessBeanFactory()

Я думаю, нам нужно увидеть, как вы настраиваете свое приложение Spring (если XML, файл context.xml, иначе аннотации в классе Configuration или SpringBootApplication. Как бы то ни было, я предполагаю, что вы не включили аннотации, поэтому Spring не знает, как искать эту аннотацию PostConstruct ...

moilejter 18.08.2018 03:44

Spring распознает аннотацию PostConstruct из коробки. Проблема в том, что по какой-то причине они не вызываются в BeanFactoryPostProcessors. Однако реализация DisposableBean или установка initMethod по-прежнему работает. Объявление bean-компонента как Component для сканирования компонентов или явно в конфигурации xml или Java не имеет никакого значения.

Nima Ajdari 18.08.2018 10:56

@NimaAJ привет, как ты думаешь в чем может быть причина?

Pasha 18.08.2018 11:38

@moilejter это не имеет значения. В моем случае Java Config и получение отруба из контекста в psvm (). Что вы подразумеваете под включением аннотаций? Они работают по умолчанию

Pasha 18.08.2018 11:40

Причина в том, что @PostConstruct оценивается для bean-компонентов, а BeanFactoryPostProcessor не один из тех, кто не объявляет его как таковой (т.е. не добавляет аннотацию @Component к классу).

daniu 22.06.2020 22:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
307
1

Ответы 1

Попробуйте реализовать org.springframework.beans.factory.InitializingBean вместо использования аннотации @PostConstruct. BeanFactoryPostProcessor может быть одним из специфических случаев, которые случаются достаточно рано в жизненном цикле, так что аннотации жизненного цикла еще не работают.

Я знаю, что у меня была такая же проблема с @PreDestroy в моем классе конфигурации BeanFactoryPostProcessor. Использование org.springframework.beans.factory.DisposableBean решило эту проблему.

Другие вопросы по теме