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配置中的所有元素,都有对应的字段进行对应。