Я попытался создать компонент 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 распознает аннотацию PostConstruct из коробки. Проблема в том, что по какой-то причине они не вызываются в BeanFactoryPostProcessors. Однако реализация DisposableBean или установка initMethod по-прежнему работает. Объявление bean-компонента как Component для сканирования компонентов или явно в конфигурации xml или Java не имеет никакого значения.
@NimaAJ привет, как ты думаешь в чем может быть причина?
@moilejter это не имеет значения. В моем случае Java Config и получение отруба из контекста в psvm (). Что вы подразумеваете под включением аннотаций? Они работают по умолчанию
Причина в том, что @PostConstruct оценивается для bean-компонентов, а BeanFactoryPostProcessor не один из тех, кто не объявляет его как таковой (т.е. не добавляет аннотацию @Component к классу).




Попробуйте реализовать org.springframework.beans.factory.InitializingBean вместо использования аннотации @PostConstruct. BeanFactoryPostProcessor может быть одним из специфических случаев, которые случаются достаточно рано в жизненном цикле, так что аннотации жизненного цикла еще не работают.
Я знаю, что у меня была такая же проблема с @PreDestroy в моем классе конфигурации BeanFactoryPostProcessor. Использование org.springframework.beans.factory.DisposableBean решило эту проблему.
Я думаю, нам нужно увидеть, как вы настраиваете свое приложение Spring (если XML, файл context.xml, иначе аннотации в классе Configuration или SpringBootApplication. Как бы то ни было, я предполагаю, что вы не включили аннотации, поэтому Spring не знает, как искать эту аннотацию PostConstruct ...