默认解析的命名空间由parseDefaultElement方法去处理,即import, alias, bean, 嵌套的beans四种元素
import
写法示例:
<import resource="CTIContext.xml" /> <import resource="customerContext.xml" />
importBeanDefinitionResource套路和之前的配置文件加载完全一样,不过注意被import进来的文件是先于当前文件 被解析的。
alias
加入有一个bean名为componentA-dataSource,但是另一个组件想以componentB-dataSource的名字使用,就可以这样定义:
<alias name="componentA-dataSource" alias="componentB-dataSource"/>
我们主要看看常见的bean标签的解析
首先获取到id和name属性,name属性支持配置多个,以逗号分隔,如果没有指定id,那么将以第一个name属性值代替。id必须是唯一的,name属性其实是alias的角色,可以和其它的bean重复,如果name也没有配置,那么其实什么也没做
String id = ele.getAttribute(ID_ATTRIBUTE);
String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);
List<String> aliases = new ArrayList<String>();
if (StringUtils.hasLength(nameAttr)) {
//按,分隔
String[] nameArr = StringUtils.tokenizeToStringArray
(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);
aliases.addAll(Arrays.asList(nameArr));
}
String beanName = id;
if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {
//name的第一个值作为id
beanName = aliases.remove(0);
}
//默认null
if (containingBean == null) {
//校验id是否已重复,如果重复直接抛异常
//校验是通过内部一个HashSet完成的,出现过的id都会保存进此Set
checkNameUniqueness(beanName, aliases, ele);
}
bean解析稍后详细解释。
如果name和id属性都没有指定,那么Spring会自己生成一个
beanName = this.readerContext.generateBeanName(beanDefinition);
String beanClassName = beanDefinition.getBeanClassName();
aliases.add(beanClassName);
可见,Spring同时会把类名作为其别名。