BeanDefinitionParserDelegate解读
来源:互联网 发布:拍淘宝送小礼品 微信 编辑:程序博客网 时间:2024/06/05 23:00
此类的主要目的,通过DOM读取xml配置文件之后,此类是解析XML bean定义的,这个类中的方法参数基本上都是Element ele,举一个例子说明解析过程如下:
public BeanDefinitionHolder parseBeanDefinitionElement(Element ele) {return parseBeanDefinitionElement(ele, null);}
public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) {//获取XML中定义的ID属性值String id = ele.getAttribute(ID_ATTRIBUTE);//获取XML中定义的NAME属性值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()) {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 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.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);return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);}return null;}
public AbstractBeanDefinition parseBeanDefinitionElement(Element ele, String beanName, BeanDefinition containingBean) {this.parseState.push(new BeanEntry(beanName));String className = null;//判断是否有CLASS属性定义,如果有则获取className值if (ele.hasAttribute(CLASS_ATTRIBUTE)) {className = ele.getAttribute(CLASS_ATTRIBUTE).trim();}try {String parent = null;//判断是否有PARENT属性定义,如果有则获取parent值if (ele.hasAttribute(PARENT_ATTRIBUTE)) {parent = ele.getAttribute(PARENT_ATTRIBUTE);}//通过工具类BeanDefinitionReaderUtils(此工具类只供内部用),此处返回的是:GenericBeanDefinition//下面解析获取到的AbstractBeanDefinition返回,设置到BeanDefinitionHolder里面去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;}
将返回的BeanDefinitionHolder经过一系列的装饰后,通过工具类BeanDefinitionReaderUtils将beanName与BeanDefinition对应关系注册到DefaultListableBeanFactory这个里面,下面的registry即为DefaultListableBeanFactory:
//用给的bean工厂注册给予的bean definitionpublic static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)throws BeanDefinitionStoreException {// Register bean definition under primary name.String beanName = definitionHolder.getBeanName();registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition());// Register aliases for bean name, if any.String[] aliases = definitionHolder.getAliases();if (aliases != null) {for (String aliase : aliases) {registry.registerAlias(beanName, aliase);}}}
0 0
- BeanDefinitionParserDelegate解读
- BeanDefinitionParserDelegate
- spring 源码解读与设计详解: 7 BeanDefinitionParserDelegate深入解读
- spring 源码解读与设计详解:6 BeanDefinitionParserDelegate与资源解析
- spring源码学习之四 BeanDefinitionParserDelegate分析
- 解析Spring源码(8)--BeanDefinitionParserDelegate
- Spring中的Bean标签的所有元素和属性BeanDefinitionParserDelegate
- Spring源码解析--Spring配置文件解析BeanDefinitionParserDelegate(四)
- java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.getL
- 解读
- 一、从 BeanDefinitionParserDelegate 解析xml bean元素,查看bean的各个属性(Spring3.2.12)
- 解读数据?解读“人”!
- 解读数据?解读“人”!
- 解读P2P
- 解读深圳
- 解读睡眠
- Makefile解读
- Irda解读
- MD5加密解密帮助类
- android 焦点获取流程
- poj1258--最小生成树prim算法实现
- ecmai用户不成功问题(有点像登录成功了但是登录状态不改变,其实是登录成功后自动退出)
- VMware接入Openstack方案分析
- BeanDefinitionParserDelegate解读
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
- c#端口扫描器源代码
- 权重随机抽取
- opengl 来画个三角形
- php中时间加减法
- 【深入Java虚拟机】之七:Javac编译与JIT编译
- android webview js交互 (java和js交互)
- Red and Black