Spring的InstantiationAware后处理器
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()) { |
- 2020-03-31
当调用 BeanFactory.getBean 方法获取 Bean 时,如果 Bean 还未创建,则会触发 Bean 的创建,本文主要关注 Bean 的创建过程。
- 2020-04-16
Spring 通过
AbstractAutoProxyCreator
来创建 AOP 代理,AbstractAutoProxyCreator 是一个抽象类,它实现了BeanPostProcessor
接口,用于在 bean 初始化完成之后创建它的代理 - 2020-04-15
dubbo 是一个流行的 RPC 框架,它提供了一个
@Reference
注解,用于配置依赖的远程接口,完成代理类的自动注入。本文主要关注@Reference
注解的实现原理。 - 2020-04-07
Spring 提供了
@Autowired
注解,可用于自动注入所需的 bean,与 xml 配置相比更加简洁,本文主要关注@Autowired
注解的实现原理。 - 2020-04-18
在 dubbo的Reference注解实现原理 中提到,
@Reference
注解用于实现 RPC client 代理的自动注入,这是通过ReferenceAnnotationBeanPostProcessor
来实现的。若要让其生效,还需要在这之前将其注册到 BeanFactory 中。