上一篇【Spring 加载、解析applicationContext.xml 流程】分析了从xml文件加载到开始解析xml里面的标签为止,基本都是跟spring 真正的核心没什么关系。
这篇我们分析 applicationContext.xml 中的bean 标签解析。
org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.java
解析id和name属性,name属性可以配置多个值,以逗号分割。name中的值相当于<alias></alias>中配置的值
createBeanDefinition()方法
创建GenericBeanDefinition实例
GenericBeanDefinition 继承了 AbstractBeanDefinition。
AbstractBeanDefinition 对应这一个<bean>标签,bean标签中每一个属性都能在AbstractBeanDefinition 中找到对应的元素。
AbstractBeanDefinition() 方法
解析bean标签的各种属性, 然后存储到GenericBeanDefinition 对象中,并返回。
<!-- 配置的bean标签属性 -->
<bean id="" name="" class="" lazy-init="default" abstract="true" autowire-candidate="default"
autowire="default" depends-on="" destroy-method="" factory-bean="" factory-method=""
init-method="" primary="true" scope="" />
调用DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT)方法解析
public class ConstructorArgumentValues {
private final Map<Integer, ValueHolder> indexedArgumentValues = new LinkedHashMap<>(0);
private final List<ValueHolder> genericArgumentValues = new LinkedList<>();
......
public static class ValueHolder implements BeanMetadataElement {
@Nullable
private Object value;
@Nullable
private String type;
@Nullable
private String name;
@Nullable
private Object source;
private boolean converted = false;
@Nullable
private Object convertedValue;
......
}
}
parsePropertyElement()
调用parsePropertyValue() 方法获取property的值。
parsePropertyValue() 方法
**解析子标签 parsePropertySubElement() **
解析完bean的所有属性,子标签后和自定义标签后存储到 GenericBeanDefinition 对象中,然后调用DefaultListableBeanFactory.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());把beanDefinitoin注册到 beanDefinitionMap中。
beanDefinitionMap 定义
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);