InstantiationAwareBeanPostProcessor
是 BeanPostProcessor
的子接口,新增了一个实例化之前(BeforeInstantiation)的回调、一个实例化之后(AfterInstantiation)填充 property 之前的回调
接口定义
InstantiationAwareBeanPostProcessor
的类结构如下图所示:

InstantiationAwareBeanPostProcessor
继承自 BeanPostProcessor
接口,它提供了 postProcessBeforeInstantiation
和 postProcessAfterInstantiation
两个方法,用于在 bean 的实例化之前和实例化之后进行扩展。
1 | // 实例化之前的回调 |
1 | // 属性填充 |
方法介绍
postProcessBeforeInstantiation
postProcessBeforeInstantiation
是在 bean 实例化之前的回调。所谓实例化,就是通过构造方法、factoryBean 等创建 bean 的实例,但不包括填充 bean 的属性值。
上图展示了 bean 的创建过程,其中第一步是创建 bean 实例,Spring 在这之前提供了一个扩展点,允许通过 BeanPostProcess
创建 bean 的代理出来,这样就不走后面的创建 bean 流程。相关代码在 AbstractAutowireCapableBeanFactory
的 createBean 方法中:
1 | // 给 BeanPostProcessors 一个机会,可以创建 bean 的代理出来,这样就不走后面的创建 bean 逻辑 |
resolveBeforeInstantiation
的主要逻辑是:
- 通过
InstantiationAwareBeanPostProcessor
的postProcessBeforeInstantiation
创建 bean 实例 - 若 bean 实例不为空,调用
BeanPostProcessor
的postProcessAfterInitialization
方法做实例化后的处理
代码如下:
1 | protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) { |
postProcessAfterInstantiation
postProcessAfterInstantiation
是在 bean 实例化之后的回调,它是 populateBean
阶段的第一步,在属性填充之前。若 postProcessAfterInstantiation
返回了 false,则不会再走后续的属性填充逻辑。
1 | boolean continueWithPropertyPopulation = true; |
postProcessProperties
InstantiationAwareBeanPostProcessor
还提供了一个 postProcessProperties
方法,在 populateBean
阶段 autowireByName 和 autowireByType 处理之后会回调该方法。
1 | for (BeanPostProcessor bp : getBeanPostProcessors()) { |