springframework源代码阅读杂记(3)---Bean元素的解析

承接上一篇文档,http://www.cnblogs.com/wangjiuyong/articles/7162379.html

Spring XML文件的Bean元素解析会进入如下函数

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
        if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
       //判断是否是import节点,并进行解析 importBeanDefinitionResource(ele); }
else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
       //判断是否是alias节点,并且进行解析 processAliasRegistration(ele); }
else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
//判断是否是Bean节点,并且进行解析 processBeanDefinition(ele, delegate); }
else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) { // 判断是否是BEANS节点,并且进行解析 doRegisterBeanDefinitions(ele); } }
processBeanDefinition(ele, delegate)的调用会进入DefaultBeanDefinitionDocumentReader的processBeanDefinition的函数。

	/**
	 * Process the given bean element, parsing the bean definition
	 * and registering it with the registry.
	 */
	protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
          //进入主要的Bean元素的解析 BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
           if (bdHolder != null) { bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder); try { // Register the final decorated instance.
                   //getReaderContext().getRegistry()得到的就是Spring的容器对象DefaultListableBeanFactory,在容器中注册得到的BeanDefinitionHolder类 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)); } }

 

delegate.parseBeanDefinitionElement(ele) 解析流程如下:

 

对象的registerBeanDefinition函数代码如下:

/**
	 * Register the given bean definition with the given bean factory.
	 * @param definitionHolder the bean definition including name and aliases
	 * @param registry the bean factory to register with
	 * @throws BeanDefinitionStoreException if registration failed
	 */
	public 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.
          //如果Bean定义中使用了alias,那么别名也会保存到容器的列表中 String[] aliases = definitionHolder.getAliases(); if (aliases != null) { for (String alias : aliases) { registry.registerAlias(beanName, alias); } } }

  

 

posted @ 2017-07-20 14:19  王久勇  阅读(137)  评论(0)    收藏  举报