老生谈spring(五):processBeanDefinition对bean标签的处理
1、上一节我们知道了bean标签的处理主要是通过processBeanDefinition方法,现在我们主要关注BeanDefinitionParserDelegate的parseBeanDefinitionElement方法,这个方法会让我们得到一个Bean Definition对象。
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
//本节重点,如何通过bean标签得到一个BeanDefinitionHolder
BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
if (bdHolder != null) {
bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
try {
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
}
catch (BeanDefinitionStoreException ex) {
...
}
getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
}
}
2、parseBeanDefinitionElement是一个包装方法,它具体逻辑是封装参数调用重载的parseBeanDefinitionElement,而在parseBeanDefinitionElement方法里也做了包装,继续调用到重载的parseBeanDefinitionElement方法。看来spring最喜欢做的事情就是包装了。。。
//方法包装
public BeanDefinitionHolder parseBeanDefinitionElement(Element ele) {
return parseBeanDefinitionElement(ele, null);
}
//实现bean标签解析的主要方法
public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean) {
//获取bean标签的id属性
String id = ele.getAttribute(ID_ATTRIBUTE);
//获取bean标签的name属性
String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);
List<String> aliases = new ArrayList<>()