上次主要看了
doCreateBean方法中的
instanceWrapper = createBeanInstance(beanName, mbd, args);这个方法, 接下来这样分析的是
doCreateBean方法的接下来的方法.
applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
//CommonAnnotationBeanPostProcessor 支持了@PostConstruct,@PreDestroy,@Resource注解
//AutowiredAnnotationBeanPostProcessor 支持 @Autowired,@Value注解
//BeanPostProcessor接口的典型运用,这里要理解这个接口
//对类中注解的装配过程
/**
* 实例化完成后接下来就需要对类中的属性进行依赖注入操作,
* 但是类里面属性和方法的依赖注入往往用@Autowired 或者@Resource 注解,
* 那么这些注解的依赖注入是如何完成的呢?
* 核心方法为 applyMergedBeanDefinitionPostProcessors 也是通过 BeanPostProcessor 接口类型实例来挨个处理的。
*
* BeanPostProcessor 接口
* (2)收集@Resource @Autowired @Value @PostConstruct,@PreDestroy 注解的方法和属性埋点
* 过滤的接口类型是:MergedBeanDefinitionPostProcessor
* 调用的方法是:postProcessMergedBeanDefinition
*/
![](https://img-blog.csdnimg.cn/20210603221243584.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
使用
MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition方法,对
MergedBeanDefinition 类型的bean进行后置处理
暴露缓存解决循环依赖问题
![](https://img-blog.csdnimg.cn/20210603221243692.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/2021060322124426.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210603221243859.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
populateBean方法
![](https://img-blog.csdnimg.cn/20210603221243772.png)
![](https://img-blog.csdnimg.cn/20210603221243971.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/2021060322124442.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210603221243998.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210603221243829.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
initializeBean方法
![](https://img-blog.csdnimg.cn/20210603221243643.png)
![](https://img-blog.csdnimg.cn/2021060322124455.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210603221243905.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/2021060322124446.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
回到主方法干applyBeanPostProcessorsBeforeInitialization
![](https://img-blog.csdnimg.cn/2021060322124412.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
ApplicationContextAwareProcessor的实现类的调用,
调用所有 BeanPostProcessors 的 postProcessBeforeInitialization 方法
![](https://img-blog.csdnimg.cn/20210603221244150.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
在看看主方法中的
invokeCustomInitMethod 方法
![](https://img-blog.csdnimg.cn/20210603221243812.png)
![](https://img-blog.csdnimg.cn/2021060322124482.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210603221243944.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
/**
* afterPropertiesSet 和 Init-method 和有@PostConstruct 注解的方法其实核心功能都是一样的,
* 只是调用 时序不一样而已,都是在该类实例化和 IOC 做完后调用的,
* 我们可以在这些方法中做一些在 spring 或者 servlet 容器启动的时候的初始化工作。
* 比如缓存预热,比如缓存数据加载到内存,比如配置解析,等等初始化工作调用顺
* 序为先调用@PostConstruct(注解使用)、然后是 afterPropertiesSet、InitMethod(xml 配置)方法。
*/
回到主方法
applyBeanPostProcessorsAfterInitialization
![](https://img-blog.csdnimg.cn/20210603221243828.png)
![](https://img-blog.csdnimg.cn/2021060322124418.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
在看看最后bean销毁时执行的方法调用registerDisposableBeanIfNecessary
![](https://img-blog.csdnimg.cn/20210603221243971.png)
![](https://img-blog.csdnimg.cn/2021060322124483.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTMzMzYwNzI=,size_16,color_FFFFFF,t_70)
![](https://img-blog.csdnimg.cn/20210603221243984.png)