1. 扩展点分类

1.1. Bean定义扩展点

BeanDefinitionRegistryPostProcessor
BeanFactoryPostProcessor

1.2. Aware类扩展点

BeanNameAware
BeanClassLoaderAware
BeanFactoryAware

1.3. 生命周期的回调

PostConstruct
InitializingBean
init-method
PreDestroy
DisposableBean
destroy-method

2. 扩展点解析

https://www.processon.com/view/link/5f194e727d9c0835d38cc2cb

image.png

2.1. 总体概括

1、Spring-基础

2.2. InstantiationAwareBeanPostProcessor

https://juejin.cn/post/7068511224471748645
https://mrbird.cc/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Spring-BeanPostProcessor-InstantiationAwareBeanPostProcessor.html
https://cloud.tencent.com/developer/article/1409273

image.png

2.2.1. postProcessBeforeInstantiation

2.2.2. postProcessAfterInstantiation

2.2.3. postProcessPropertyValues

AutowiredAnnotationBeanPostProcessor

  1. InstantiationAwareBeanPostProcessor接口继承BeanPostProcessor接口,它内部提供了3个方法,再加上BeanPostProcessor接口内部的2个方法,所以实现这个接口需要实现5个方法。InstantiationAwareBeanPostProcessor接口的主要作用在于目标对象的实例化过程中需要处理的事情,包括实例化对象的前后过程以及实例的属性设置
  2. postProcessBeforeInstantiation方法是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走
  3. postProcessAfterInstantiation方法在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。因为它的返回值是决定要不要调用postProcessPropertyValues方法的其中一个因素(因为还有一个因素是mbd.getDependencyCheck());如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行;如果返回true, postProcessPropertyValues就会被执行
  4. postProcessPropertyValues方法对属性值进行修改(这个时候属性值还未被设置,但是我们可以修改原本该设置进去的属性值)。如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改
  5. 父接口BeanPostProcessor的2个方法postProcessBeforeInitialization和postProcessAfterInitialization都是在目标对象被实例化之后,并且属性也被设置之后调用的

image.png

postProcessBeforeInstantiation方法返回实例对象后跳过了对象的初始化操作,直接执行了postProcessAfterInitialization(该方法在自定义初始化方法执行完成之后执行),跳过了postProcessAfterInstantiation,postProcessPropertyValues以及自定义的初始化方法(start方法)

2.3. 第5步invokeBeanFactoryPostProcessors()

image.png

2.3.1. BeanDefinitionRegistryPostProcessor

执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
作用: 在注册BeanDefinition的可以对beanFactory进行扩展
调用时机: Ioc加载时注册BeanDefinition 的时候会调用

2.3.2. BeanFactoryPostProcessor

执行BeanFactoryPostProcessor的postProcessBeanFactory方法
作用:动态注册BeanDefinition
调用时机: Ioc加载时注册BeanDefinition 的时候会调用

3. 实战经验

4. 参考与感谢