浅谈Spring--默认标签解析

70 阅读1分钟

接着上文的程序入口,我们来看看Spring是如何解析默认标签的。

首先,会遍历每一个节点:

然后根据节点的类型调用相应的方法:

我们关心的重点就是Bean标签是怎么被解析的,所以点进去看看:

好嘛,第一句就看不懂了,哪儿冒出来一个BeanDefinitionHolder?只好点进去看看它是做什么的:

清晰了,原来其内部持有了一个BeanDefinition对象。我们在学习Spring的时候就知道,它会将xml文件读入内存,那么必然是用对象保存,就是用的这个BeanDefinition来保存。所以我们跟进一下parseBeanDefinitionElement()。

事实上,每一个Bean标签都会被映射成一个BeanDefinition对象.

将这个方法分成两段来解析:

1.解析bean标签的属性并将其封装到BeanDefinition

//创建GenericBeanDefinition对象(通用的BeanDefinition实现类)
AbstractBeanDefinition bd = createBeanDefinition(className, parent);

//解析bean标签的属性,并把解析出来的属性设置到BeanDefinition对象中
parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);
bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));

parseBeanDefinitionAttributes()就是对每个属性进行赋值,简单的看一个:

if (ele.hasAttribute(INIT_METHOD_ATTRIBUTE)) {
	String initMethodName = ele.getAttribute(INIT_METHOD_ATTRIBUTE);
	bd.setInitMethodName(initMethodName);
} else if (this.defaults.getInitMethod() != null) {
	bd.setInitMethodName(this.defaults.getInitMethod());
	bd.setEnforceInitMethod(false);
}

就是拿到xml的值,赋给BeanDefinition对象。

2.解析bean标签的子标签并将其封装到BeanDefinition

//解析bean中的meta标签
parseMetaElements(ele, bd);

//解析bean中的lookup-method标签
parseLookupOverrideSubElements(ele, bd.getMethodOverrides());

//解析bean中的replaced-method标签
parseReplacedMethodSubElements(ele, bd.getMethodOverrides());

//解析bean中的constructor-arg标签
parseConstructorArgElements(ele, bd);

//解析bean中的property标签
parsePropertyElements(ele, bd);