关于 Spring bean 生命周期初始化序列的困惑

Puzzle about Spring bean lifecycle initialize sequence

这是我的代码:

 @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
}

@Override
public void afterPropertiesSet() throws Exception {
    CompatibleGroovyCompiler.init();
    thriftClientProxyRefs = REF_SPLITTER.splitToList(ref);
}

@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}

据我了解,Spring应该按照

的顺序调用我的方法
  1. setApplicationContext
  2. postProcessBeanFactory
  3. afterPropertiesSet

但我添加了一些调试打印,它显示

  1. setApplicationContext
  2. afterPropertiesSet
  3. postProcessBeanFactory

有些事情让我觉得 CompatibleGroovyCompiler.init(); 可能是造成这种情况的原因,所以我删除了那个电话,并得到了我期待的订单。

有人可以解释一下吗?

你的理解不完整。

一旦构建了 bean 并注入了所有依赖项,就会调用 afterPropertiesSet 方法。这适用于创建的每种类型的 bean。

你的 bean 是一个 BeanFactoryPostProcessor,它也适用于那个,尽管这个 instance/bean 很早就创建了,因为处理 BeanFactory 需要它。

bean 在调用该方法之前尚未准备好,之后 bean 可以用作完全初始化的 BeanPostProcessor