`
liudeh_009
  • 浏览: 243243 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

spring解析xml生成BeanDefinition的过程

阅读更多

        毫无疑问,spring的核心是bean,一个简单的获取bean的过程如下:

    ClassPathResource resource = new ClassPathResource("services.xml");
    DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
    XmlBeanDefinitionReader reader =  new XmlBeanDefinitionReader(factory);
    reader.loadBeanDefinitions(resource);
    SayService sayService  = (SayService)factory.getBean("sayService");

        services.xml就是spring的[配置文件,sayService就是配置文件里面配置的bean.

 

        spring生成bean并不是一气呵成,因为bean之间是有相互依赖关系的.只能先把xml都解析完后才能生成最终需要调用的bean.BeanDefinition就是配置文件与最终生成bean之间的桥梁.本文主要分析spring如何解析bean的配置文件到生成包含bean元信息对象BeanDefinition的过程.下面是这个过程的一个简单的时序图:

            

 

 
spring解析xml生成BeanDefinition对象的过程主要涉及XmlBeanDefinitionReader,DocumentLoader,DefaultBeanDefinitionDocumentReader,BeanDefinitionParserDelegate,DefaultListableBeanFactory这几个类,几个类的职责分别是:
1. XmlBeanDefinitionReader根据xml的文件路径生成InputStream对象,进而得到InputStream的xml的包装类InputSource对象.
2. DocumentLoader解析InputSource得到Document对象.
3. DefaultBeanDefinitionDocumentReader类委托BeanDefinitionParserDelegate类解析Document对象生成BeanDefinition对象,BeanDefinition对象中包含xml中配置的bean的元信息.
4.生成的BeanDefinition对象最终都会注册到DefaultListableBeanFactory,供后续生成bean对象使用.

 spring的配置文件中bean的配置元素id和name的关系

          一个bean可以同时配置id,name.name里面 可以配置多个名称,多个名称之间可以重复, 名称之间用逗号隔开,如果没有配置id,默认名称的第一作为id.并且整个容器不同bean之间不能有相同的id和name,spring在解析xml配置文件时会有校验,校验代码如下:

         

	protected void checkNameUniqueness(String beanName, List aliases, Element beanElement) {
		String foundName = null;

		if (StringUtils.hasText(beanName) && this.usedNames.contains(beanName)) {
			foundName = beanName;
		}
		if (foundName == null) {
			foundName = (String) CollectionUtils.findFirstMatch(this.usedNames, aliases);
		}
		if (foundName != null) {
			error("Bean name '" + foundName + "' is already used in this file", beanElement);
		}

		this.usedNames.add(beanName);
		this.usedNames.addAll(aliases);
	}

  

    在调用getBean(String name)方法时,会将name转换为id,具体代码如下:

     

	public String canonicalName(String name) {
		String canonicalName = name;
		// Handle aliasing.
		String resolvedName = null;
		do {
			resolvedName = (String) this.aliasMap.get(canonicalName);
			if (resolvedName != null) {
				canonicalName = resolvedName;
			}
		}
		while (resolvedName != null);
		return canonicalName;
	}

}

 

 

 

  • 大小: 36.5 KB
0
0
分享到:
评论

相关推荐

    spring中的BeanFactory解析xml文件

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

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

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

    spring 自定义xml标签

    2. **实现解析器(Parser Class)**:解析器通常是实现了`org.springframework.beans.factory.xml.BeanDefinitionParser`接口的类,负责解析自定义标签并生成`BeanDefinition`。例如,`...

    xmlbean API

    1. **XML到Java对象的绑定**:XMLBean可以解析XML文档,生成对应的Java类实例。这些类直接反映了XML文档的结构,每个元素和属性都对应于类的字段或方法。这样,开发者可以通过调用对象的方法来访问和修改XML数据,...

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

    在Spring框架中,配置类解析是构建应用上下文的关键步骤,它涉及到BeanDefinition的生成、配置类的导入以及Bean的定义。在《Spring配置类解析(下)》中,主要探讨了配置类解析过程的多轮循环以及在这个过程中如何加载...

    Spring源码解析.pdf

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

    06 源码分析-spring自定义标签解析过程

    2. **解析标签**:在解析XML文件时,Spring的`DocumentReader`类会遇到自定义标签。这时,它会查找`NamespaceHandler`,并通过`NamespaceHandler`找到对应的`BeanDefinitionParser`来处理这个标签。 3. **调用解析...

    Spring多种加载Bean方式解析

    主要的流程是找到定义Bean的方式,然后生成BeanDefinition后注册到Spring上下文中,由Spring自动创建Bean的实例。 BeanDefinition BeanDefinition是一个接口,用来描述一个Bean实例,例如是SINGLETON还是PROTOTYPE...

    Spring原理解析-BeanFactory—容器加载过程解析

    3. 解析XML文件生成BeanDefinition对象。 4. 将BeanDefinition对象注册到BeanFactory中。 5. 当需要实例化Bean时,BeanFactory根据BeanDefinition中的信息进行操作。 理解这个过程对于深入学习Spring框架至关重要,...

    00000025_beandefine的用法.rar

    《深入解析Spring框架中的BeanDefinition》 在Spring框架中,BeanDefinition是核心概念之一,它定义了Bean的元数据,包括Bean的类名、初始化方法、依赖关系、属性值等关键信息。本教程将深入探讨BeanDefinition的...

    Spring框架系列(7) - Spring IOC实现原理详解之IOC初始化流程.doc

    解析的目的是生成 BeanDefinition 对象。BeanDefinition 对象是 IOC 容器中的核心对象,负责描述对象之间的依赖关系。在这里,我们使用的是 DefaultBeanDefinitionDocumentReader 来解析 Bean 定义资源。 6. 注册 ...

    模拟spring工厂模式底层实现。

    当我们配置Spring时,我们定义Bean的元数据,如Bean的类、依赖关系等,这些信息会被Spring解析并存储在BeanDefinition中。BeanFactory根据这些定义在运行时动态地创建Bean实例。 高级一点,ApplicationContext是...

    IOC容器初始化过程

    总结来说,IOC容器初始化是一个复杂但至关重要的过程,它包括定位配置文件、解析文件生成BeanDefinition对象,以及将这些对象注册到容器中。这个过程确保了Spring能够根据用户的配置信息动态管理Bean的生命周期,...

    XML读取以及解析

    - 配置文件,如Spring框架的bean配置。 - 数据交换格式,如RSS、Atom等。 在实际开发中,根据项目需求和资源限制,选择合适的解析方法和工具至关重要。如果你遇到缺少的库文件,可以查阅相关编程语言的官方文档或...

    spring-beans源码

    在解析BeanDefinition时,Spring会根据属性值和构造参数解析依赖,并在实例化Bean后进行注入。 5. **Bean的生命周期管理** Spring提供了对Bean生命周期的完整控制,包括初始化、正常运行以及销毁阶段。Bean可以...

    【Java面试】介绍下Spring IoC的工作流程.doc

    - **BeanDefinition的生成与注册**:Spring容器在启动时会解析这些声明,生成对应的BeanDefinition对象。BeanDefinition包含了Bean的类信息、属性、依赖关系等元数据。所有BeanDefinition会被保存在一个内部Map中,...

    spring自定义标签

    解析器是实现了`BeanDefinitionParser`接口的类,负责解析自定义标签并生成`BeanDefinition`对象。XML标签则是在配置文件中使用的元素,与解析器关联。 2. **实现自定义标签解析器** 要实现自定义标签解析器,我们...

    spring 源码解析

    Spring 的 IOC 容器在初始化时会解析 XML 配置文件,创建 bean 的定义(BeanDefinition),并构建一个 bean 实例的图。在 bean 被请求时,根据 BeanDefinition 中的信息决定如何创建和初始化 bean,包括实例化、属性...

    spring-context源码

    `DefaultListableBeanFactory`负责解析XML配置文件,生成`BeanDefinition`并将其注册到bean工厂中。在bean的实例化过程中,`InstantiationAwareBeanPostProcessor`接口提供了自定义初始化逻辑的机会。 三、依赖注入...

Global site tag (gtag.js) - Google Analytics