框架源码专题-Spring-7、扩展点
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
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
2.2.1. postProcessBeforeInstantiation
2.2.2. postProcessAfterInstantiation
2.2.3. postProcessPropertyValues
AutowiredAnnotationBeanPostProcessor
- InstantiationAwareBeanPostProcessor接口继承BeanPostProcessor接口,它内部提供了3个方法,再加上BeanPostProcessor接口内部的2个方法,所以实现这个接口需要实现5个方法。InstantiationAwareBeanPostProcessor接口的主要作用在于目标对象的实例化过程中需要处理的事情,包括实例化对象的前后过程以及实例的属性设置
- postProcessBeforeInstantiation方法是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走
- postProcessAfterInstantiation方法在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null。因为它的返回值是决定要不要调用postProcessPropertyValues方法的其中一个因素(因为还有一个因素是mbd.getDependencyCheck());如果该方法返回false,并且不需要check,那么postProcessPropertyValues就会被忽略不执行;如果返回true, postProcessPropertyValues就会被执行
- postProcessPropertyValues方法对属性值进行修改(这个时候属性值还未被设置,但是我们可以修改原本该设置进去的属性值)。如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改
- 父接口BeanPostProcessor的2个方法postProcessBeforeInitialization和postProcessAfterInitialization都是在目标对象被实例化之后,并且属性也被设置之后调用的
postProcessBeforeInstantiation方法返回实例对象后跳过了对象的初始化操作,直接执行了postProcessAfterInitialization(该方法在自定义初始化方法执行完成之后执行),跳过了postProcessAfterInstantiation,postProcessPropertyValues以及自定义的初始化方法(start方法)
2.3. 第5步invokeBeanFactoryPostProcessors()
2.3.1. BeanDefinitionRegistryPostProcessor
执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法
作用: 在注册BeanDefinition的可以对beanFactory进行扩展
调用时机: Ioc加载时注册BeanDefinition 的时候会调用
2.3.2. BeanFactoryPostProcessor
执行BeanFactoryPostProcessor的postProcessBeanFactory方法
作用:动态注册BeanDefinition
调用时机: Ioc加载时注册BeanDefinition 的时候会调用