`

spring 解析配置文件BeanDefinition

 
阅读更多

 

1:ResourceLoader 加载配置文件 默认实现ResourcePatternResolver

2:XmlBeanDefinitionReader  读取配置文件封装BeanDefinition

3:BeanDefinitionRegistry 注册BeanBeanDefinition 默认实现是DefaultListableBeanFactory

 

解析配置文件默认由XmlWebApplicationContext 的loadBeanDefinitions方法

  protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws IOException {
        // Create a new XmlBeanDefinitionReader for the given BeanFactory.
        XmlBeanDefinitionReader beanDefinitionReader = XBeanHelper.createBeanDefinitionReader(this, beanFactory, xmlPreprocessors);

        // Configure the bean definition reader with this context's
        // resource loading environment.
        beanDefinitionReader.setResourceLoader(this);
        beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

        // Allow a subclass to provide custom initialization of the reader,
        // then proceed with actually loading the bean definitions.
        initBeanDefinitionReader(beanDefinitionReader);
        loadBeanDefinitions(beanDefinitionReader);
    }

 4:DefaultBeanDefinitionDocumentReader在解析元素标签时会先判断是否是spring默认标签还是客户自定的,如果是自定义需要用客户的命名解析器。

protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
		if (delegate.isDefaultNamespace(root)) {
			NodeList nl = root.getChildNodes();
			for (int i = 0; i < nl.getLength(); i++) {
				Node node = nl.item(i);
				if (node instanceof Element) {
					Element ele = (Element) node;
					if (delegate.isDefaultNamespace(ele)) {
						parseDefaultElement(ele, delegate);
					}
					else {
						delegate.parseCustomElement(ele);
					}
				}
			}
		}
		else {
			delegate.parseCustomElement(root);
		}
	}

 5:在解析标签时,会根据不同标签进行解析

 

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {

// import 标签
        if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
            importBeanDefinitionResource(ele);
        }

//alias 标签
        else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
            processAliasRegistration(ele);
        }

//bean 标签
        else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
            processBeanDefinition(ele, delegate);
        }
    }

 

 6:最终BeanDefinition 存入Map里

 

 

public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException {

		Assert.hasText(beanName, "Bean name must not be empty");
		Assert.notNull(beanDefinition, "BeanDefinition must not be null");

		if (beanDefinition instanceof AbstractBeanDefinition) {
			try {
				((AbstractBeanDefinition) beanDefinition).validate();
			}
			catch (BeanDefinitionValidationException ex) {
				throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
						"Validation of bean definition failed", ex);
			}
		}

		synchronized (this.beanDefinitionMap) {
			Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);
			if (oldBeanDefinition != null) {
				if (!this.allowBeanDefinitionOverriding) {
					throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,
							"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +
							"': There is already [" + oldBeanDefinition + "] bound.");
				}
				else {
					if (this.logger.isInfoEnabled()) {
						this.logger.info("Overriding bean definition for bean '" + beanName +
								"': replacing [" + oldBeanDefinition + "] with [" + beanDefinition + "]");
					}
				}
			}
			else {
				this.beanDefinitionNames.add(beanName);
				this.frozenBeanDefinitionNames = null;
			}
			this.beanDefinitionMap.put(beanName, beanDefinition);

			resetBeanDefinition(beanName);
		}
	}
 

 

分享到:
评论

相关推荐

    Spring读取配置文件原理(Spring如何依赖注入的)

    首先,Spring解析XML配置文件的过程是由`BeanDefinitionReader`完成的,它负责读取并解析XML文件,生成BeanDefinition对象。Spring提供了多种类型的BeanDefinitionReader,例如`XmlBeanDefinitionReader`,用于处理...

    Spring源码学习二:BeanDefinition解析1

    在Spring容器启动时,配置文件或注解中的bean定义会被解析成BeanDefinition对象,然后由容器进行管理。本文将深入探讨BeanDefinition的内部结构和主要属性。 首先,BeanDefinition接口继承了AttributeAccessor和...

    Spring源码学习四:BeanDefinition装载前奏曲1

    总结来说,Spring的BeanDefinition装载过程涉及了从XML配置文件解析、BeanDefinition创建、BeanFactory初始化到Bean实例化的多个步骤。在学习源码时,应重点关注BeanDefinition的创建、加载和实例化过程,理解Spring...

    Spring源码学习五:BeanDefinition装载1

    在本篇文章中,我们将深入探讨 Spring 的源码,了解如何装载 BeanDefinition,并解析其实现细节。 BeanDefinition 的装载 在前一篇文章中,我们已经了解了 BeanDefinition 的概念和 importance。现在,我们将深入...

    撸一撸Spring Framework-IoC-BeanDefinition(csdn)————程序.pdf

    `GenericApplicationContext`继承自`BeanFactory`,并通过`XmlBeanDefinitionReader`来加载XML配置文件中的BeanDefinition。 在`GenericXmlApplicationContext`的构造函数中,调用了`load`和`refresh`方法。`load`...

    spring中的BeanFactory解析xml文件

    当我们谈论“Spring中的BeanFactory解析XML文件”时,我们实际上是在讨论如何通过XML配置文件来定义、创建和管理bean。这篇文章将深入探讨BeanFactory的工作原理,以及XML配置文件在其中的作用。 首先,BeanFactory...

    day38 04-Spring加载配置文件

    在Spring框架中,配置文件的加载是其核心功能之一,它允许开发者定义bean的实例化、依赖注入和其他元数据,从而实现控制反转(IoC)和面向切面编程(AOP)。今天我们将深入探讨"day38 04-Spring加载配置文件"这一...

    Spring配置类解析(下)(csdn)————程序.pdf

    在解析配置类的过程中,Spring会通过`loadBeanDefinitions()`方法将配置类转换为BeanDefinition。BeanDefinition是Spring容器中描述bean的元数据,它包含了bean的类型、初始化方法、依赖关系等信息。`...

    自定义 Schema 解析 Spring Bean

    通过定义自定义Schema,我们可以限制或扩展Spring配置文件中可用的元素和属性,确保配置的正确性和一致性。 实现自定义Schema解析的过程主要包括以下几个步骤: 1. **定义Schema**: 使用XSD(XML Schema ...

    Spring 源码分析(Bean的初始化)

    在Spring框架中,Bean的初始化是一个至关重要的过程,它涉及到从XML配置文件或者注解中读取Bean的定义,解析并构建Bean实例。本篇文章主要分析了Spring如何通过`ClassPathXmlApplicationContext`来启动和初始化Bean...

    Spring源码解析.pdf

    - **作用**:`BeanDefinition`是Spring用来描述Bean配置元数据的一种方式,它是Bean的抽象表示,包含Bean的类型、作用域、依赖关系等信息。 - **注册**:在IoC容器启动过程中,所有定义的Bean都会被转换成`Bean...

    spring bean life cycle

    `@Component`注解的类会自动被Spring扫描并注册为Bean,而`@Configuration`类则提供了更高级别的配置方式,可以替代XML配置文件。 此外,Spring提供了一种名为BeanPostProcessor的接口,它允许我们自定义Bean实例化...

    spring和Mybatis的xml配置文件提示约束包

    "spring和Mybatis的xml配置文件提示约束包"这个主题,主要是关于在XML配置文件中使用的DTD(Document Type Definition)文档类型定义,它为XML文件提供了结构约束和语法规范。 DTD是一种元语言,用于定义XML文档的...

    Spring源码解密之默认标签的解析

    最后,使用`BeanDefinitionReaderUtils`的`registerBeanDefinition`方法将解析后的`BeanDefinition`注册到Bean定义注册表中,使得Spring容器在启动时能够识别并实例化这些Bean。注册过程中,`getReaderContext().get...

    Spring Bean 加载顺序 .

    解析后的配置会被转化为BeanDefinition对象,包含Bean的类名、依赖、初始化方法等信息。这些BeanDefinition被注册到Spring的BeanDefinitionRegistry中,形成一个Bean的元数据集合。 3. **Bean的作用域**: 在注册...

    Spring解密之XML解析与Bean注册示例详解

    在Spring中,XML解析是通过XmlBeanDefinitionReader来实现的,该类负责读取XML配置文件,并将其转换为BeanDefinition对象。XmlBeanDefinitionReader是Spring资源文件读取、解析、注册的实现,要重点关注该类。 在...

    00000025_beandefine的用法.rar

    在Spring容器启动时,会通过BeanDefinitionReader读取XML配置文件或通过AnnotationConfigApplicationContext读取注解配置,将BeanDefinition注册到BeanDefinitionRegistry中。注册过程包括解析配置源,创建Bean...

    这一次搞懂Spring的XML解析原理说明

    通过这个解析过程,Spring能够根据XML配置文件动态地创建和管理bean,实现DI。当需要某个bean时,Spring会自动查找并创建该bean及其依赖的bean,从而简化了代码,提高了可维护性。总的来说,理解Spring的XML解析原理...

    spring的bean加载顺序样例项目

    - 当Spring容器启动时,它首先读取配置文件,解析Bean的定义,并创建一个BeanDefinition对象,该对象包含了Bean的所有信息,如类名、属性、依赖等。 - 如果有`@Component`注解的类,Spring会通过组件扫描找到并...

Global site tag (gtag.js) - Google Analytics