- 1. 获取Bean
- 2. 创建Bean
- 2.1 创建Bean之前
- 2.1 真正的创建Bean,doCreateBean
- 3. destroy 方法跟销毁 Bean
- 4. 总结
- 《Java 2019 超神之路》
- 《Dubbo 实现原理与源码解析 —— 精品合集》
- 《Spring 实现原理与源码解析 —— 精品合集》
- 《MyBatis 实现原理与源码解析 —— 精品合集》
- 《Spring MVC 实现原理与源码解析 —— 精品合集》
- 《Spring Boot 实现原理与源码解析 —— 精品合集》
- 《数据库实体设计合集》
- 《Java 面试题 —— 精品合集》
- 《Java 学习指南 —— 精品合集》
在网上已经有跟多Bean的生命周期的博客,但是很多都是基于比较老的版本了,最近吧整个流程化成了一个流程图。待会儿使用流程图,说明以及代码的形式来说明整个声明周期的流程。注意因为代码比较多,这里的流程图只画出了大概的流程,具体的可以深入代码
1. 获取Bean
![5f552686078fc0b455260dcfbce7f8db.png](https://i-blog.csdnimg.cn/blog_migrate/bf09a75cdc87da7c2a1ad805d7725b6b.jpeg)
这里的流程图的入口在AbstractBeanFactory
类的doGetBean
方法,这里可以配合前面的getBean方法分析文章进行阅读。主要流程就是
- 先处理Bean 的名称,因为如果以“&”开头的Bean名称表示获取的是对应的FactoryBean对象;
- 从缓存中获取单例Bean,有则进一步判断这个Bean是不是在创建中,如果是的就等待创建完毕,否则直接返回这个Bean对象
- 如果不存在单例Bean缓存,则先进行循环依赖的解析
- 解析完毕之后先获取父类BeanFactory,获取到了则调用父类的getBean方法,不存在则先合并然后创建Bean
2. 创建Bean
2.1 创建Bean之前
![2cbf08e5b64a6418e9eec9b75af80d97.png](https://i-blog.csdnimg.cn/blog_migrate/2eaccade50531360bc0639e3bebf3e5d.jpeg)
这个流程图对应的代码在AbstractAutowireCapableBeanFactory
类的createBean
方法中。
- 这里会先获取
RootBeanDefinition
对象中的Class对象并确保已经关联了要创建的Bean的Class。 - 这里会检查3个条件 (1)Bean的属性中的
beforeInstantiationResolved
字段是否为true,默认是false。(2)Bean是原生的Bean (3)Bean的hasInstantiationAwareBeanPostProcessors
属性为true,这个属性在Spring准备刷新容器钱转杯BeanPostProcessors的时候会设置,如果当前Bean实现了InstantiationAwareBeanPostProcessor
则这个就会是true。当三个条件都存在的时候,就会调用实现的InstantiationAwareBeanPostProcessor
接口的postProcessBeforeInstantiation
方法,然后获取返回的Bean,如果返回的Bean不是null还会调用实现的BeanPostProcessor
接口的postProcessAfterInitialization
方法,这里用代码说明
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
//条件1
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
//条件2跟条件3
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
//调用实现的postProcessBeforeInstantiation方法
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
//调用实现的postProcessAfterInitialization方法
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
//不满足2或者3的时候就会设置为false
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
- 如果上面3个条件其中一个不满足就不会调用实现的方法。默认这里都不会调用的这些
BeanPostProcessors
的实现方法。然后继续执行后面的doCreateBean
方法。
2.1 真正的创建Bean,doCreateBean
![cb602e54c070234837033975fb265cb4.png](https://i-blog.csdnimg.cn/blog_migrate/58f71815632355072411066a086ddc88.jpeg)
这个代码的实现还是在AbstractAutowireCapableBeanFactory
方法中。流程是
- 先检查
instanceWrapper
变量是不是null,这里一般是null,除非当前正在创建的Bean在factoryBeanInstanceCache
中存在这个是保存还没创建完成的FactoryBean的集合。 - 调用createBeanInstance方法实例化Bean,这个方法在后面会讲解
- 如果当前
RootBeanDefinition
对象还没有调用过实现了的MergedBeanDefinitionPostProces