Spring中的那些PostProcessor挂载点

本篇文章笔者主要介绍一下Spring中的那些挂载点。

Spring在 实例化、属性注入、初始化之间,预留了大量的 PostProcessor 类型的挂载点。

以下结果基于spring-framework-5.0.x。

  • 实例化之前,先调用 postProcessBeforeInstantiation 方法(来自 InstantiationAwareBeanPostProcessor 接口)
  • 调用 determineCandidateConstructors 方法,决定使用哪一个构造器(来自 SmartInstantiationAwareBeanPostProcessor 接口)
  • bean实例化
  • 调用 postProcessMergedBeanDefinition 方法(如 扫描 @Autowired 注解并记录下来,来自 MergedBeanDefinitionPostProcessor 接口)
  • 实例化之后,再调用 postProcessAfterInstantiation 方法 (来自 InstantiationAwareBeanPostProcessor 接口)
  • 属性赋值,调用 postProcessPropertyValues 方法(如 @Autowired 属性注入)
  • 初始化之前,会调用 postProcessBeforeInitialization 方法 (来自 BeanPostProcessor 接口)
  • bean初始化,包括:afterProperties 方法调用,自定义 initMethod 方法调用
  • 初始化之后,会调用 postProcessAfterInitialization 方法(来自 BeanPostProcessor 接口)

代码阅读建议

Spring创建bean的代码比较集中,可以从 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[]) 方法开始阅读,可以看到如上顺序的方法调用

不要在意那些小细节,但也不能放过那些关键点!

总结

总结一下,在 bean 实例化、属性赋值、初始化这几个阶段中,Spring通过 PostProcessor 接口的形式,留下了很多挂载点。这一点符合 设计模式 中的开闭原则,让后续的开发者能够便捷使用 Spring 继承自己的应用和服务。