1. 注册 BPP 的 BD

image.png

image.png

2. 创建 BPP

在 refresh () 的 6. registerBeanPostProcessors () ,将所有 BeanPostProcessor 注册到容器中。注意:只是注册但并未执行%%
1926-🏡⭐️◼️CommonAnnotationBeanPostProcessor 与 AutowiredAnnotationBeanPostProcessor ?🔜MSTM📝 都实现了 MergedBeanDefinitionPostProcessor,在 invokeBeanPostProcessor 中创建 BPP,并执行 postProcessMergedBeanDefinition 方法◼️⭐️-point-202302061926%%

3. LifecycleMetadata 存入

%%
▶31.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230323-1910%%
❕ ^er3o6i

image.png

image.png

执行 CommonAnnotationBeanPostProcessor 的方法 postProcessMergedBeanDefinition 实际调用了其父类 InitDestroyAnnotationBeanPostProcessor 的方法,在其中调用方法 findLifecycleMetadata 获取生命周期元数据并保存

image.png
%%
0914-🏡⭐️◼️CommonAnnotationBeanPostProcessor 中用到了双重检查锁 ?🔜MSTM📝 在第 11 步初始化剩下的单实例 Bean 的过程中,在真正初始化方法调用之前,InitDestroyAnnotationBeanPostProcessor 继承了 BeanPostProcessor,在执行 postProcessBeforeInitialization 方法时,会查找 lifeCycleMetadataCache,这里就用到了双重检查锁。其实在存入的时候,在第三个后置处理器,MergedBeanDefinitionPostProcessor 的 postProcessMergedBeanDefinition 方法中,也是调用了同一个方法,即 findLifecycleMetadata◼️⭐️-point-202302120914%%

4. LifecycleMetadata 使用

%%
▶34.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230323-2007%%
❕ ^0ty81n

image.png

image.png

InitDestroyAnnotationBeanPostProcessor. postProcessBeforeInitialization

findLifecycleMetadata–>metadata.invokeInitMethods

image.png
image.png

5. 执行顺序

image.png
image.png

注解版@PostConstruct 在初始化之前,而 XML 方式是在初始化之后,AfterPropertiesSet 之后

image.png

image.png
https://www.bilibili.com/video/BV1CS4y1e7xo/?spm_id_from=..search-card.all.click&vd_source=c5b2d0d7bc377c0c35dbc251d95cf204

6. 实战经验

7. 参考与感谢