spring源码解读(二) —— 如何解析bean元素

    技术2025-03-24  22

    bean元素是我们在xml配置文件中,使用到最多的一个元素,当我们在xml中配置了一个bean元素之后,spring帮助我们做了什么事呢?让我们跟进spring的源码来一探究竟。

    实现配置一个简单的xml文件:

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myTestBean" name="myTestBean2" class="com.study.MyTestBean"> </bean> </beans>

    首先是在DefaultBeanDefinitionDocumentReader这个类的parseDefaultElement方法中可以看到对于默认标签的四个分之,主要对应的是import、alias、bean、beans,我们主要是看对bean的解析。

    进入到processBeanfinition方法内,其方法主要逻辑:

    1.通过parseBeanDefinitionElement方法,拿到元素bean中属性,存入到对应的实体BeanDefinitionHolder中;

    2.然后判断bean标签下,是否还有子元素,如果有还要调用decorateBeanDefinitionIfRequired方法,继续解析子元素下的自定义标签;

    3.然后对BeanDefinitionHolder进行注册;

    4.在最后发出响应事件,通知其他监听器。

    那我们首先来看一下是如何解析bean元素中的属性的,也就是parseBeanDefinitionElement方法,主要逻辑如下:

    1.获取bean元素中最常用的两个属性id和name;

    2.调用parseBeanDefinitionElement,进一步获取其他元素,并将其封装进AbstractBeanDefinition中;

    3.如果查到bean没有指定beanName,就用spring中的默认规则帮我们自动生成beanName;

    4.最后将信息封装到BeanDefinitionHolder中

     进入parseBeanDefinitionElement中,可以看到,bean的所有属性都在这个方法中进行解析:

    1.解析class属性,parent属性;

    2.解析元数据的parseMetaElements方法;

    3.解析lookup-method属性的parseLookupOverrideSubElements方法;

    4.解析replace-method属性的parseReplaceMethodSubElements方法;

    5.解析构造函数参数的parseConstructorArgElements方法;

    6.解析property子元素parsePropertyElements方法;

    7.解析qualifier子元素的parseQualifierElements方法。

     我们可以看到最终解析完之后,是返回了一个AbstractBeanDefinition这个类,我们可以来看一下这个类的作用是什么?,主要就是对应xml元素bean的一个映射实体,在我们xml配置中的所有元素,都有对应的字段进行对应。

    Processed: 0.009, SQL: 9