ioc 解析bean标签

终于来到了重头戏,解析bean标签了

processBeanDefinition 方法

	/**
	 * Process the given bean element, parsing the bean definition
	 * and registering it with the registry.
	 * 处理给定的元素,解析bean definition 并用注册器注册
	 */
	protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
		// 处理给定的元素
		BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
		if (bdHolder != null) {
			// 装饰 bean definition
			bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
			try {
				// Register the final decorated instance.
				// 注册最终的装饰实例
				BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
			}
			catch (BeanDefinitionStoreException ex) {
				getReaderContext().error("Failed to register bean definition with name '" +
						bdHolder.getBeanName() + "'", ele, ex);
			}
			// Send registration event.
			// 发出注册事件
			getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
		}
	}

parseBeanDefinitionElement 方法

	/**
	 * 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.
	 * 解析bean 定义本身,不考虑name或alias
	 * 解析过程出错会返回null
	 */
	@Nullable
	public AbstractBeanDefinition parseBeanDefinitionElement(
			Element ele, String beanName, @Nullable BeanDefinition containingBean) {
		// parseState是一个链表
		this.parseState.push(new BeanEntry(beanName));

		String className = null;
		if (ele.hasAttribute(CLASS_ATTRIBUTE)) {
			// 获取class属性
			className = ele.getAttribute(CLASS_ATTRIBUTE).trim();
		}
		String parent = null;
		if (ele.hasAttribute(PARENT_ATTRIBUTE)) {
			// 获取parent属性
			parent = ele.getAttribute(PARENT_ATTRIBUTE);
		}

		try {
			// 构造 bean definition,实际类型是GenericBeanDefinition
			AbstractBeanDefinition bd = createBeanDefinition(className, parent);
			// 解析bean的属性
			parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);
			// description标签
			bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));
			// 解析meta标签
			parseMetaElements(ele, bd);
			// 解析lookup-method标签
			parseLookupOverrideSubElements(ele, bd.getMethodOverrides());
			// 解析replaced-method标签
			parseReplacedMethodSubElements(ele, bd.getMethodOverrides());
			// 解析constructor-arg标签
			parseConstructorArgElements(ele, bd);
			// 解析property标签
			parsePropertyElements(ele, bd);
			// 解析qualifier标签
			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;
	}

这个方法内部调用的方法都是获取各类标签属性最终存储到了bean definition中,代码不贴了。

decorateBeanDefinitionIfRequired 方法

这个方法的作用是解析自定义的标签

转载于:https://my.oschina.net/u/3295680/blog/3073102

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值