解析Spring源码(8)--BeanDefinitionParserDelegate
来源:互联网 发布:中科恒业医学软件 编辑:程序博客网 时间:2024/06/14 09:57
/** * Parses the supplied {@code <bean>} element. May return {@code null} * if there were errors during parse. Errors are reported to the * {@link org.springframework.beans.factory.parsing.ProblemReporter}. */ public BeanDefinitionHolder parseBeanDefinitionElement(Element ele) { return parseBeanDefinitionElement(ele, null); }
/** * 封装beanDefinition,beanName的BeanDefinitionHolder对象 * Parses the supplied {@code <bean>} element. May return {@code null} * if there were errors during parse. Errors are reported to the * {@link org.springframework.beans.factory.parsing.ProblemReporter}. */ public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) { String id = ele.getAttribute(ID_ATTRIBUTE);//helloWorldService 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.isDebugEnabled()) { logger.debug("No XML 'id' specified - using '" + beanName + "' as bean name and " + aliases + " as aliases"); } } if (containingBean == null) { checkNameUniqueness(beanName, aliases, ele);//可以忽略这不操作 } //返回AbstractBeanDefinition对象,属性进行了初始化resource,beanClassName AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean); if (beanDefinition != null) { if (!StringUtils.hasText(beanName)) {//false 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.isDebugEnabled()) { logger.debug("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); //封装beanDefinition,beanName的BeanDefinitionHolder对象 return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray); } return null; }
/** * 返回AbstractBeanDefinition,属性进行了初始化resource,beanClassName * Parse the bean definition itself, without regard to name or aliases. May return * {@code null} if problems occurred during the parsing of the bean definition. */ public AbstractBeanDefinition parseBeanDefinitionElement( Element ele, String beanName, BeanDefinition containingBean) { //new BeanEntry(beanName),一个封装beanName的简单类 //parseState构建的一个栈,以stack作为底层存储结构,private final Stack<Entry> state; this.parseState.push(new BeanEntry(beanName)); String className = null; if (ele.hasAttribute(CLASS_ATTRIBUTE)) { //com.test.HelloWorldService className = ele.getAttribute(CLASS_ATTRIBUTE).trim();//去掉前后空白; } try { String parent = null; if (ele.hasAttribute(PARENT_ATTRIBUTE)) {//false parent = ele.getAttribute(PARENT_ATTRIBUTE); } //创建GenericBeanDefinition bd对象,设置了beanclassName属性bd.setBeanClassName(className); AbstractBeanDefinition bd = createBeanDefinition(className, parent); //containingBean=null,对bd的属性进行设置,因为我们的例子没有这些属性所以基本没干啥 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); //子节点<property name="text" value="Hello World!"></property> parsePropertyElements(ele, bd);//给bd添加属性, parseQualifierElements(ele, bd); //重要的是属性resource, 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; }
/** * <property name="text" value="Hello World!"></property> * PROPERTY_ELEMENT="property" * * Parse property sub-elements of the given bean element. */ public void parsePropertyElements(Element beanEle, BeanDefinition bd) { NodeList nl = beanEle.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if (isCandidateElement(node) && nodeNameEquals(node, PROPERTY_ELEMENT)) { parsePropertyElement((Element) node, bd); } } }
/** * //给bd添加属性 * * <property name="text" value="Hello World!"></property> * * Parse a property element. */ public void parsePropertyElement(Element ele, BeanDefinition bd) { String propertyName = ele.getAttribute(NAME_ATTRIBUTE);//text if (!StringUtils.hasLength(propertyName)) { error("Tag 'property' must have a 'name' attribute", ele); return; } this.parseState.push(new PropertyEntry(propertyName));//入栈 try { if (bd.getPropertyValues().contains(propertyName)) { error("Multiple 'property' definitions for property '" + propertyName + "'", ele); return; } Object val = parsePropertyValue(ele, bd, propertyName);//获取value值,并封装 PropertyValue pv = new PropertyValue(propertyName, val); parseMetaElements(ele, pv);//本例不作为 pv.setSource(extractSource(ele)); bd.getPropertyValues().addPropertyValue(pv);//给bd添加属性 } finally { this.parseState.pop();//将属性名name="text"出栈 } }
至此结束!
0 0
- 解析Spring源码(8)--BeanDefinitionParserDelegate
- Spring源码解析--Spring配置文件解析BeanDefinitionParserDelegate(四)
- spring源码学习之四 BeanDefinitionParserDelegate分析
- spring 源码解读与设计详解:6 BeanDefinitionParserDelegate与资源解析
- spring 源码解读与设计详解: 7 BeanDefinitionParserDelegate深入解读
- BeanDefinitionParserDelegate
- 一、从 BeanDefinitionParserDelegate 解析xml bean元素,查看bean的各个属性(Spring3.2.12)
- spring源码解析(收藏)
- spring源码解析(一)
- spring源码解析(二)
- Spring源码解析(一)
- Spring源码解析之-Aop源码解析(2)
- Spring源码解析--Spring配置文件解析NamespaceHandler(五)
- spring源码(8)注册解析的BeanDefinition
- spring源码附录(8)import、beans标签的解析
- Spring中的Bean标签的所有元素和属性BeanDefinitionParserDelegate
- spring ioc 源码解析(一)
- spring ioc 源码解析(二)
- hdu 3001 Travelling
- docker环境下Jenkins持续集成(二)
- POJ 2728 Desert King (最优比率生成树 01分数规划问题)
- bzoj 3129: [Sdoi2013]方程(容斥原理+组合数学+数论)
- java5、java6、java7、java8的新特性
- 解析Spring源码(8)--BeanDefinitionParserDelegate
- 求区间内和问题(线段树)(hdu 1166)
- 吴建平院士:网络空间安全的挑战和机遇
- uCOS-III开关中断进出临界区的三个宏
- nginx uri重写
- 排序算法之希尔排序(传统排序的突破)
- 欢迎使用CSDN-markdown编辑器
- HTML5的Video标签的属性,方法和事件汇总
- struts2_01入门如何搭建环境