毫无疑问,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; } }
相关推荐
当我们谈论“Spring中的BeanFactory解析XML文件”时,我们实际上是在讨论如何通过XML配置文件来定义、创建和管理bean。这篇文章将深入探讨BeanFactory的工作原理,以及XML配置文件在其中的作用。 首先,BeanFactory...
首先,Spring解析XML配置文件的过程是由`BeanDefinitionReader`完成的,它负责读取并解析XML文件,生成BeanDefinition对象。Spring提供了多种类型的BeanDefinitionReader,例如`XmlBeanDefinitionReader`,用于处理...
2. **实现解析器(Parser Class)**:解析器通常是实现了`org.springframework.beans.factory.xml.BeanDefinitionParser`接口的类,负责解析自定义标签并生成`BeanDefinition`。例如,`...
1. **XML到Java对象的绑定**:XMLBean可以解析XML文档,生成对应的Java类实例。这些类直接反映了XML文档的结构,每个元素和属性都对应于类的字段或方法。这样,开发者可以通过调用对象的方法来访问和修改XML数据,...
在Spring框架中,配置类解析是构建应用上下文的关键步骤,它涉及到BeanDefinition的生成、配置类的导入以及Bean的定义。在《Spring配置类解析(下)》中,主要探讨了配置类解析过程的多轮循环以及在这个过程中如何加载...
- **作用**:`BeanDefinition`是Spring用来描述Bean配置元数据的一种方式,它是Bean的抽象表示,包含Bean的类型、作用域、依赖关系等信息。 - **注册**:在IoC容器启动过程中,所有定义的Bean都会被转换成`Bean...
2. **解析标签**:在解析XML文件时,Spring的`DocumentReader`类会遇到自定义标签。这时,它会查找`NamespaceHandler`,并通过`NamespaceHandler`找到对应的`BeanDefinitionParser`来处理这个标签。 3. **调用解析...
主要的流程是找到定义Bean的方式,然后生成BeanDefinition后注册到Spring上下文中,由Spring自动创建Bean的实例。 BeanDefinition BeanDefinition是一个接口,用来描述一个Bean实例,例如是SINGLETON还是PROTOTYPE...
3. 解析XML文件生成BeanDefinition对象。 4. 将BeanDefinition对象注册到BeanFactory中。 5. 当需要实例化Bean时,BeanFactory根据BeanDefinition中的信息进行操作。 理解这个过程对于深入学习Spring框架至关重要,...
《深入解析Spring框架中的BeanDefinition》 在Spring框架中,BeanDefinition是核心概念之一,它定义了Bean的元数据,包括Bean的类名、初始化方法、依赖关系、属性值等关键信息。本教程将深入探讨BeanDefinition的...
解析的目的是生成 BeanDefinition 对象。BeanDefinition 对象是 IOC 容器中的核心对象,负责描述对象之间的依赖关系。在这里,我们使用的是 DefaultBeanDefinitionDocumentReader 来解析 Bean 定义资源。 6. 注册 ...
当我们配置Spring时,我们定义Bean的元数据,如Bean的类、依赖关系等,这些信息会被Spring解析并存储在BeanDefinition中。BeanFactory根据这些定义在运行时动态地创建Bean实例。 高级一点,ApplicationContext是...
总结来说,IOC容器初始化是一个复杂但至关重要的过程,它包括定位配置文件、解析文件生成BeanDefinition对象,以及将这些对象注册到容器中。这个过程确保了Spring能够根据用户的配置信息动态管理Bean的生命周期,...
- 配置文件,如Spring框架的bean配置。 - 数据交换格式,如RSS、Atom等。 在实际开发中,根据项目需求和资源限制,选择合适的解析方法和工具至关重要。如果你遇到缺少的库文件,可以查阅相关编程语言的官方文档或...
在解析BeanDefinition时,Spring会根据属性值和构造参数解析依赖,并在实例化Bean后进行注入。 5. **Bean的生命周期管理** Spring提供了对Bean生命周期的完整控制,包括初始化、正常运行以及销毁阶段。Bean可以...
- **BeanDefinition的生成与注册**:Spring容器在启动时会解析这些声明,生成对应的BeanDefinition对象。BeanDefinition包含了Bean的类信息、属性、依赖关系等元数据。所有BeanDefinition会被保存在一个内部Map中,...
解析器是实现了`BeanDefinitionParser`接口的类,负责解析自定义标签并生成`BeanDefinition`对象。XML标签则是在配置文件中使用的元素,与解析器关联。 2. **实现自定义标签解析器** 要实现自定义标签解析器,我们...
Spring 的 IOC 容器在初始化时会解析 XML 配置文件,创建 bean 的定义(BeanDefinition),并构建一个 bean 实例的图。在 bean 被请求时,根据 BeanDefinition 中的信息决定如何创建和初始化 bean,包括实例化、属性...
`DefaultListableBeanFactory`负责解析XML配置文件,生成`BeanDefinition`并将其注册到bean工厂中。在bean的实例化过程中,`InstantiationAwareBeanPostProcessor`接口提供了自定义初始化逻辑的机会。 三、依赖注入...