为什么不对由bean实现的BeanFactoryPostProcessor和ApplicationContextAware调用@PostConstruct?

时间:2018-08-18 00:59:05

标签: java spring spring-bean spring-ioc

我试图创建一个Spring bean并记录其生命周期的所有可能阶段。

但是我注意到在这种情况下,不会调用用@PostConstruct注释的方法。

我想发生这种情况是因为BeanFactoryPostProcessorApplicationContextAware迫使容器尽早实例化它,但是我不完全知道。

能给我解释一下吗?

请在下面考虑一个代码段:

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()

1 个答案:

答案 0 :(得分:0)

尝试实现org.springframework.beans.factory.InitializingBean而不是使用@PostConstruct注释。 BeanFactoryPostProcessor可能是一个特例,它在生命周期中发生得足够早,以至于生命周期注释尚未起作用。

我知道我的@PreDestroy配置类上的BeanFactoryPostProcessor也有同样的问题。使用org.springframework.beans.factory.DisposableBean解决了这个问题。