1接口切换流程图_Spring 的 Bean 生命周期,11 张高清流程图及代码,深度解析

本文详细解析了Spring框架中Bean的生命周期,包括从获取Bean到销毁Bean的整个过程,通过11张高清流程图及代码展示。重点讨论了Bean的实例化、属性填充、初始化以及销毁等关键步骤,深入理解Spring Bean的生命周期对于优化应用性能至关重要。
摘要由CSDN通过智能技术生成
  • 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

这里的流程图的入口在AbstractBeanFactory类的doGetBean方法,这里可以配合前面的getBean方法分析文章进行阅读。主要流程就是

  1. 先处理Bean 的名称,因为如果以“&”开头的Bean名称表示获取的是对应的FactoryBean对象;
  2. 从缓存中获取单例Bean,有则进一步判断这个Bean是不是在创建中,如果是的就等待创建完毕,否则直接返回这个Bean对象
  3. 如果不存在单例Bean缓存,则先进行循环依赖的解析
  4. 解析完毕之后先获取父类BeanFactory,获取到了则调用父类的getBean方法,不存在则先合并然后创建Bean

2. 创建Bean

2.1 创建Bean之前

2cbf08e5b64a6418e9eec9b75af80d97.png

这个流程图对应的代码在AbstractAutowireCapableBeanFactory类的createBean方法中。

  1. 这里会先获取RootBeanDefinition对象中的Class对象并确保已经关联了要创建的Bean的Class。
  2. 这里会检查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;
    }
  1. 如果上面3个条件其中一个不满足就不会调用实现的方法。默认这里都不会调用的这些BeanPostProcessors的实现方法。然后继续执行后面的doCreateBean方法。

2.1 真正的创建Bean,doCreateBean

cb602e54c070234837033975fb265cb4.png

这个代码的实现还是在AbstractAutowireCapableBeanFactory方法中。流程是

  1. 先检查instanceWrapper变量是不是null,这里一般是null,除非当前正在创建的Bean在factoryBeanInstanceCache中存在这个是保存还没创建完成的FactoryBean的集合。
  2. 调用createBeanInstance方法实例化Bean,这个方法在后面会讲解
  3. 如果当前RootBeanDefinition对象还没有调用过实现了的MergedBeanDefinitionPostProces
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值