spring源码解析(3)-BeanDefinition
BeanDefinition是一个接口,代表XML文档中<bean>元素的类表现形式,它有三个子类RootBeanDefinition,ChildBeanDefinition和GenericBeanDefinition。
对<bean>元素的实际解析主要通过XmlBeanDefinitionReader、DefaultBeanDefinitionDocumentReader、BeanDefinitionParserDelegate这三个类
主要用到了BeanDefinitionParserDelegate中的三个方法
(1)public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean) //方法解析了id、name两个标签,并把其他标签交给另一个parseBeanDefinitionElement来处理 (2)public AbstractBeanDefinition parseBeanDefinitionElement( Element ele, String beanName, @Nullable BeanDefinition containingBean) //方法解析了class、parent两个标签,并把其他标签交给了下一个方法parseBeanDefinitionAttributes (3)public AbstractBeanDefinition parseBeanDefinitionAttributes(Element ele, String beanName,@Nullable BeanDefinition containingBean, AbstractBeanDefinition bd) //方法对bean元素的剩下的各种标签进行了解析,包括scope、singleton、abstract、lazy-init、autowire、dependency-check、depends-on、primary、init-method、destroy-method、factory-method等 //并将解析得到的信息存储到AbstractBeanDefinition抽象类中,这个类也实现了BeanDefinition接口。
另外贴一下方法的源码,因为它除了解析了<bean>的一级标签外,在后面的调用中还解析了<meta><lookup-method><replaced-method><constructor-arg><property>
<qualifier>等子标签,非常重要。
public AbstractBeanDefinition parseBeanDefinitionElement( Element ele, String beanName, @Nullable BeanDefinition containingBean) { this.parseState.push(new BeanEntry(beanName)); String className = null; if (ele.hasAttribute(CLASS_ATTRIBUTE)) { className = ele.getAttribute(CLASS_ATTRIBUTE).trim(); } String parent = null; if (ele.hasAttribute(PARENT_ATTRIBUTE)) { parent = ele.getAttribute(PARENT_ATTRIBUTE); } try { AbstractBeanDefinition bd = createBeanDefinition(className, parent); parseBeanDefinitionAttributes(ele, beanName, containingBean, bd); bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT)); parseMetaElements(ele, bd); parseLookupOverrideSubElements(ele, bd.getMethodOverrides()); parseReplacedMethodSubElements(ele, bd.getMethodOverrides()); parseConstructorArgElements(ele, bd); parsePropertyElements(ele, bd); parseQualifierElements(ele, bd); bd.setResource(this.readerContext.getResource()); bd.setSource(extractSource(ele)); return bd; } catch (ClassNotFoundException ex) { error("Bean class [" + className + "] not found", ele, ex); } catch (NoClassDefFoundError err) { error("Class that bean class [" + className + "] depends on not found", ele, err); } catch (Throwable ex) { error("Unexpected failure during bean definition parsing", ele, ex); } finally { this.parseState.pop(); } return null; }
想要了解解析后的到底拿到了哪些属性,可以看一下AbstractBeanDefinition类