spring配置文件加载 loadBeanDefinitions分析

下面来分析loadBeanDefinitions方法,如下图:

loadBeanDefinitions(beanFactory);,这里的beanFactory是对象DefaultListableBeanFactory,这个对象是具体实际干活的类,

重点看loadBeanDefinitions方法,

 

 

 

 

 

 

 

 

 

这里比较关键的是判断是否是默认的命名空间,如果是默认的命名空间则调用parseDefaultElement方法解析,否则调用parseCustomElement方法解析自定义标签。默认标签有

import,alias,bean,beans

 

 

 

 

方法如下:

 

@Nullable

public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean) {

String id = ele.getAttribute(ID_ATTRIBUTE);

String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);

 

List<String> aliases = new ArrayList<>();

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()) {

beanName = aliases.remove(0);

if (logger.isTraceEnabled()) {

logger.trace("No XML 'id' specified - using '" + beanName +

"' as bean name and " + aliases + " as aliases");

}

}

 

if (containingBean == null) {

checkNameUniqueness(beanName, aliases, ele);

}

 

AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);

if (beanDefinition != null) {

if (!StringUtils.hasText(beanName)) {

try {

if (containingBean != null) {

beanName = BeanDefinitionReaderUtils.generateBeanName(

beanDefinition, this.readerContext.getRegistry(), true);

}

else {

beanName = this.readerContext.generateBeanName(beanDefinition);

// Register an alias for the plain bean class name, if still possible,

// if the generator returned the class name plus a suffix.

// This is expected for Spring 1.2/2.0 backwards compatibility.

String beanClassName = beanDefinition.getBeanClassName();

if (beanClassName != null &&

beanName.startsWith(beanClassName) && beanName.length() > beanClassName.length() &&

!this.readerContext.getRegistry().isBeanNameInUse(beanClassName)) {

aliases.add(beanClassName);

}

}

if (logger.isTraceEnabled()) {

logger.trace("Neither XML 'id' nor 'name' specified - " +

"using generated bean name [" + beanName + "]");

}

}

catch (Exception ex) {

error(ex.getMessage(), ele);

return null;

}

}

String[] aliasesArray = StringUtils.toStringArray(aliases);

return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);

}

 

return null;

 

}

 

 

里面的细讲解析这里就不一一列举了,解析完成之后返回对象:AbstractBeanDefinition,最后再包装成包装类BeanDefinitionHolder返回。接下来就是注册beanDefinition了,registerBeanDefinition

 

 

到这来就完成了beanDefinition的注册了,最关键的是要记住 beanDefinitionMap和beanDefinitionNames这两个属性,后续反射实例化都会用到的。

最后附上一个简单的流程图:(关于自定义标签,后续再讲)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值