bean的生命周期分析(一)

本文详细分析了Spring框架中Bean的生命周期,从bean的声明开始,深入到全流程的梳理,包括从refresh方法的调用,BeanFactory对象的获取,BeanDefinition对象的创建及其存储过程。特别关注了XML配置下,如何通过AbstractXmlApplicationContext、BeanDefinitionReaderUtils、DefaultBeanDefinitionDocumentReader等类逐步解析并注册BeanDefinition。
摘要由CSDN通过智能技术生成

一、bean的声明

  • xml声明bean。
  • @bean、@Component、@Service等等等基于注解的形式。
  • ……

二、全流程梳理

以xml的方式声明bean为例,这里

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");

2.1 进入refresh方法

ClassPathXmlApplicationContext构造器中调用了另一个构造器:
在这里插入图片描述
该构造器中执行了refresh()方法
在这里插入图片描述

2.2 获取BeanFactory对象

首先我们要知道,Bean对象和BeanDefinition对象都是是通过BeanFactory创建。
所以,只有在获取BeanFactory之后才能获取到BeanDefinition。

  • 下面获取beanfactory对象:
    在这里插入图片描述
  • 点进去,到了AbstractApplicationContext类的obtainFreshBeanFactory方法。
    在这里插入图片描述
  • 再点,AbstractRefreshableApplicationContext类的refreshBeanFactory方法。这里我们看到,在创建BeanFatory对象的同时创建了BeanDefinition对象
    在这里插入图片描述

2.3 创建BeanDefinition对象

2.3.1 AbstractXmlApplicationContext类

  • 点进去loadBeanDefinitions方法,因为我们是以xml创建bean举例,所以这里会跳转到xml相关的实现类——AbstractXmlApplicationContext类,对应的loadBeanDefinitions方法。beanFactory就是XmlBeanDefinitionReader里面的registry,所以后面我们看到的registry就是beanFactory对象。
    在这里插入图片描述
  • 再点!125行获取配置文件路径。再点进去127行。AbstractXmlApplicationContext类。
    在这里插入图片描述

2.3.2 AbstractBeanDefinitionReader类

  • 下面一路点,下面4个图片的方法都在AbstractBeanDefinitionReader类。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.3.3 XmlBeanDefinitionReader类

  • 跳到实现类XmlBeanDefinitionReader
    在这里插入图片描述
    在这里插入图片描述
    这里388行读取配置文件
    389行才是注册BeanDefinitions
    在这里插入图片描述
    在这里插入图片描述

2.3.4 DefaultBeanDefinitionDocumentReader类

  • DefaultBeanDefinitionDocumentReader类下的方法
    在这里插入图片描述
    138是解析xml之前做的事情,140是解析完之后做的事情。
    在这里插入图片描述
  • 这里通过解析xml文件遍历里面的bean标签创建beanDefinition
    在这里插入图片描述
  • 根据当前的元素标签,选择不同的解析方式。比如:import、alias、beans
    在这里插入图片描述
    在这里插入图片描述

2.3.5 BeanDefinitionParserDelegate类

  • 类BeanDefinitionParserDelegate的方法
    在这里插入图片描述
  • 到这里,终于到主要的逻辑了。
    在这里插入图片描述
    在这里插入图片描述
  • 548获取全限定类名,556创建BeanDefinition对象。
    在这里插入图片描述
  • BeanDefinitionParserDelegate类的方法
    在这里插入图片描述

2.3.6 BeanDefinitionReaderUtils类

  • 类BeanDefinitionReaderUtils的方法
    在这里插入图片描述

总结

在容器创建时会先去创建一个beanFactory,然后使用XmlBeanDefinitionReader去读取xml配置文件,把里面的标签进行解析,然后创建BeanDefinition对象来存放bean标签中各个属性的值。所以BeanDefinition相当于就是保存了bean的定义信息的对象。

通过BeanDefinition里面的信息,就可以使用反射来创建bean对象。

2.4 BeanDefinition的存储

  • 我们回到【2.3.4】节的DefaultBeanDefinitionDocumentReader的processBeanDefinition()方法中。在这里创建beanDefinition对象并存储在bdHolder中。
    在这里插入图片描述
    bdHolder是beanDefinition,而getReaderContext().getRegistry()是BeanFactory。
    这里getBeanFactory和getRegistry返回的都是同样的:
    在这里插入图片描述
    debug也可以看出来
    在这里插入图片描述
    DefaultListableBeanFactory是BeanDefinitionRegistry的实现类。
  • 327行这行代码的作用就是将beanDefintion对象注册到beanFactory中。
    在这里插入图片描述

2.4.1 BeanDefinitionReaderUtils类

  • 进入
    在这里插入图片描述

2.4.2 DefaultListableBeanFactory类

  • 进入registerBeanDefinition方法。
    在这里插入图片描述
    最终会运行到这里:
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CtrlZ1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值