7.Spring源码解析-parseBeanDefinitions解析beanDefinitions-LMLPHP

7.Spring源码解析-parseBeanDefinitions解析beanDefinitions-LMLPHP
默认解析的命名空间由parseDefaultElement方法去处理,即import, alias, bean, 嵌套的beans四种元素
7.Spring源码解析-parseBeanDefinitions解析beanDefinitions-LMLPHP

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标签的解析
7.Spring源码解析-parseBeanDefinitions解析beanDefinitions-LMLPHP
7.Spring源码解析-parseBeanDefinitions解析beanDefinitions-LMLPHP
首先获取到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);
}

7.Spring源码解析-parseBeanDefinitions解析beanDefinitions-LMLPHP
bean解析稍后详细解释。
如果name和id属性都没有指定,那么Spring会自己生成一个
7.Spring源码解析-parseBeanDefinitions解析beanDefinitions-LMLPHP

beanName = this.readerContext.generateBeanName(beanDefinition);
String beanClassName = beanDefinition.getBeanClassName();
aliases.add(beanClassName);

可见,Spring同时会把类名作为其别名。

11-28 19:54