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解析XML配置文件的过程是由`BeanDefinitionReader`完成的,它负责读取并解析XML文件,生成BeanDefinition对象。Spring提供了多种类型的BeanDefinitionReader,例如`XmlBeanDefinitionReader`,用于处理...
在Spring容器启动时,配置文件或注解中的bean定义会被解析成BeanDefinition对象,然后由容器进行管理。本文将深入探讨BeanDefinition的内部结构和主要属性。 首先,BeanDefinition接口继承了AttributeAccessor和...
总结来说,Spring的BeanDefinition装载过程涉及了从XML配置文件解析、BeanDefinition创建、BeanFactory初始化到Bean实例化的多个步骤。在学习源码时,应重点关注BeanDefinition的创建、加载和实例化过程,理解Spring...
在本篇文章中,我们将深入探讨 Spring 的源码,了解如何装载 BeanDefinition,并解析其实现细节。 BeanDefinition 的装载 在前一篇文章中,我们已经了解了 BeanDefinition 的概念和 importance。现在,我们将深入...
`GenericApplicationContext`继承自`BeanFactory`,并通过`XmlBeanDefinitionReader`来加载XML配置文件中的BeanDefinition。 在`GenericXmlApplicationContext`的构造函数中,调用了`load`和`refresh`方法。`load`...
当我们谈论“Spring中的BeanFactory解析XML文件”时,我们实际上是在讨论如何通过XML配置文件来定义、创建和管理bean。这篇文章将深入探讨BeanFactory的工作原理,以及XML配置文件在其中的作用。 首先,BeanFactory...
在Spring框架中,配置文件的加载是其核心功能之一,它允许开发者定义bean的实例化、依赖注入和其他元数据,从而实现控制反转(IoC)和面向切面编程(AOP)。今天我们将深入探讨"day38 04-Spring加载配置文件"这一...
在解析配置类的过程中,Spring会通过`loadBeanDefinitions()`方法将配置类转换为BeanDefinition。BeanDefinition是Spring容器中描述bean的元数据,它包含了bean的类型、初始化方法、依赖关系等信息。`...
通过定义自定义Schema,我们可以限制或扩展Spring配置文件中可用的元素和属性,确保配置的正确性和一致性。 实现自定义Schema解析的过程主要包括以下几个步骤: 1. **定义Schema**: 使用XSD(XML Schema ...
在Spring框架中,Bean的初始化是一个至关重要的过程,它涉及到从XML配置文件或者注解中读取Bean的定义,解析并构建Bean实例。本篇文章主要分析了Spring如何通过`ClassPathXmlApplicationContext`来启动和初始化Bean...
- **作用**:`BeanDefinition`是Spring用来描述Bean配置元数据的一种方式,它是Bean的抽象表示,包含Bean的类型、作用域、依赖关系等信息。 - **注册**:在IoC容器启动过程中,所有定义的Bean都会被转换成`Bean...
`@Component`注解的类会自动被Spring扫描并注册为Bean,而`@Configuration`类则提供了更高级别的配置方式,可以替代XML配置文件。 此外,Spring提供了一种名为BeanPostProcessor的接口,它允许我们自定义Bean实例化...
"spring和Mybatis的xml配置文件提示约束包"这个主题,主要是关于在XML配置文件中使用的DTD(Document Type Definition)文档类型定义,它为XML文件提供了结构约束和语法规范。 DTD是一种元语言,用于定义XML文档的...
最后,使用`BeanDefinitionReaderUtils`的`registerBeanDefinition`方法将解析后的`BeanDefinition`注册到Bean定义注册表中,使得Spring容器在启动时能够识别并实例化这些Bean。注册过程中,`getReaderContext().get...
解析后的配置会被转化为BeanDefinition对象,包含Bean的类名、依赖、初始化方法等信息。这些BeanDefinition被注册到Spring的BeanDefinitionRegistry中,形成一个Bean的元数据集合。 3. **Bean的作用域**: 在注册...
在Spring中,XML解析是通过XmlBeanDefinitionReader来实现的,该类负责读取XML配置文件,并将其转换为BeanDefinition对象。XmlBeanDefinitionReader是Spring资源文件读取、解析、注册的实现,要重点关注该类。 在...
在Spring容器启动时,会通过BeanDefinitionReader读取XML配置文件或通过AnnotationConfigApplicationContext读取注解配置,将BeanDefinition注册到BeanDefinitionRegistry中。注册过程包括解析配置源,创建Bean...
通过这个解析过程,Spring能够根据XML配置文件动态地创建和管理bean,实现DI。当需要某个bean时,Spring会自动查找并创建该bean及其依赖的bean,从而简化了代码,提高了可维护性。总的来说,理解Spring的XML解析原理...
- 当Spring容器启动时,它首先读取配置文件,解析Bean的定义,并创建一个BeanDefinition对象,该对象包含了Bean的所有信息,如类名、属性、依赖等。 - 如果有`@Component`注解的类,Spring会通过组件扫描找到并...