`

spring bean解析过程分析

    博客分类:
  • JAVA
阅读更多

近期想扩展定义自己的配置文件的标签,采用以前写的而一个篇扩展的方式,只能扩展自己的附加的类,无法实现组装bean的方式,所以针对spring对默认的命名空间的解析bean的方式进行分析

 

主要的分析代码都在DefaultBeanDefinitionDocumentReader中的方法registerBeanDefinitions中

  this.readerContext = readerContext;

  logger.debug("Loading bean definitions");
  Element root = doc.getDocumentElement();

  BeanDefinitionParserDelegate delegate = createHelper(readerContext, root);

  preProcessXml(root);
  parseBeanDefinitions(root, delegate);
  postProcessXml(root);

 

其实preProcessXml(root)和postProcessXml(root)供去扩展,默认没有实现任何功能

主要是parseBeanDefinitions(root, delegate);
  if (delegate.isDefaultNamespace(root.getNamespaceURI())) {            //TODO:core bean处理
   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;
     String namespaceUri = ele.getNamespaceURI();
     if (delegate.isDefaultNamespace(namespaceUri)) {
      parseDefaultElement(ele, delegate);
     }
     else {
      delegate.parseCustomElement(ele);                      //TODO:解析bean
     }
    }
   }
  }
  else {
   delegate.parseCustomElement(root);                         //自定义元素
  }

 

如果是默认的命名空间采用parseDefaultElement(ele, delegate)去处理,如果是自定义的delegate.parseCustomElement(ele)去处理

首先查看 default的解析,default包含如下几个标签,分别解析
private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
  if (DomUtils.nodeNameEquals(ele, IMPORT_ELEMENT)) {
   importBeanDefinitionResource(ele);
  }
  else if (DomUtils.nodeNameEquals(ele, ALIAS_ELEMENT)) {
   processAliasRegistration(ele);
  }
  else if (DomUtils.nodeNameEquals(ele, BEAN_ELEMENT)) {   //TODO:处理xml中定义的bean元素
   processBeanDefinition(ele, delegate);
  }

 }

我们主要关注的是bean的解析,所以只是查看一下processBeanDefinition(ele, delegate);
  BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
  if (bdHolder != null) {
   bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
   try {
    // Register the final decorated instance.
    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));
  }

解析完成,组装成BeanComponentDefinition

 

 自定义标签的解析方式

  String namespaceUri = ele.getNamespaceURI();
  NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);
  if (handler == null) {
   error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele);
   return null;
  }
  return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd));
通过方法查看出来,如果是自定义的标签,就读取在spring.handler中配置的Handler进行配置的解析

分享到:
评论

相关推荐

    springBean加载过程源码解析文档,附有代码类名和行数

    Spring Bean 加载过程源码解析文档 Spring Bean 加载过程是 Spring 框架中最核心的部分之一,涉及到 ApplicationContext 的初始化、Bean 的加载和注册等过程。在 Spring Boot 应用程序中,SpringApplication 负责...

    Spring Bean重复执行两次(实例被构造两次)问题分析

    Spring容器在解析配置时,如果发现多个具有相同ID的Bean定义,会抛出异常。但如果这些定义分布在不同的配置文件中,或者通过编程方式动态添加,就可能导致容器内出现两个相同的Bean实例。 2. **@Autowired注解的...

    spring运行过程中动态注册bean

    在Spring框架中,动态注册Bean是一项非常实用的功能,它允许我们在应用运行时向Spring容器添加新的Bean定义。这种能力在很多场景下都是极其有用的,比如根据不同的环境配置加载不同的服务实现,或者在运行时根据某些...

    Spring Bean 加载顺序 .

    这个过程涉及到Bean定义的解析、实例化、初始化等多个步骤。让我们详细探讨Spring Bean加载顺序的各个环节。 1. **配置源解析**: Spring支持多种配置方式,包括XML、Java配置类(@Configuration)、注解(@...

    spring bean life cycle

    以下是对Spring Bean生命周期的详细解析。 首先,Bean的生命周期可以分为四个主要阶段: 1. **实例化**:Spring容器在遇到一个Bean定义时,会通过反射机制创建Bean实例。如果Bean定义中有`factory-method`属性,...

    详解Spring简单容器中的Bean基本加载过程

    Spring 简单容器中的 Bean ...Spring 简单容器中的 Bean 基本加载过程是一个复杂的过程,它涉及到 XML 文件的解析、bean 的注册和加载等多个步骤。只有了解这个过程,才能更好地使用 Spring 框架来开发企业级应用程序。

    自定义 Schema 解析 Spring Bean

    本篇文章将聚焦于“自定义Schema解析Spring Bean”这一主题,这是一项高级功能,允许开发者扩展Spring的XML配置能力,以满足特定项目的需要。 自定义Schema解析是Spring框架提供的一个强大特性,它允许开发者创建...

    Spring源码深度解析第二版

    Bean的生命周期包括了Bean的创建、初始化和销毁等过程。依赖注入是指容器将Bean的依赖项注入到Bean中。AOP是指容器提供的面向切面编程功能。 2.3 工程搭建 为了使用Spring框架的容器,我们需要搭建工程环境。工程...

    spring的bean加载顺序样例项目

    在"spring的bean加载顺序样例项目"中,我们可以通过分析和实验来深入理解这一主题。下面将详细阐述Spring Bean的加载顺序以及相关知识点。 1. **Bean的定义与作用域** - Spring中的Bean是在`beans.xml`或Java配置...

    Spring源码解析.pdf

    ### Spring源码解析知识点 #### 一、Spring IoC 容器详解 ##### 1. BeanFactory —— 最基础的IoC容器 - **概念**:`BeanFactory` 是Spring框架中最基本的IoC容器,它负责管理Bean的生命周期,包括创建、配置和...

    Spring 源码(14)Spring Bean 的创建过程(5).doc

    在本篇中,我们将深入探讨Spring Bean的第五种创建方式,即通过反射进行创建,特别是利用`SmartInstantiationAwareBeanPostProcessor`接口来解析构造函数的过程。这一过程对于理解和优化Spring应用的性能至关重要。 ...

    Spring5.0源码深度解析之SpringBean循环依赖问题解决方案.docx

    Spring5.0源码深度解析之SpringBean循环依赖问题解决方案 Spring5.0源码深度解析之SpringBean循环依赖问题解决方案是指在Spring框架中如何解决Bean的循环依赖问题。在Spring框架中,Bean的循环依赖指的是两个或多个...

    Spring bean生命周期demo

    在Spring容器初始化时,它会读取配置文件(如XML或Java配置),解析Bean定义,包括其依赖关系、初始化方法、作用域等属性。这个阶段不涉及Bean的实际实例化,而是构建Bean的元数据。 2. **Bean实例化** 实例化是...

    Spring源码分析.pdf

    Spring 源码分析 Spring 框架是 Java 语言中最流行的开源框架之一,它提供了一个强大且灵活的基础设施来构建企业级应用程序。在 Spring 框架中,IOC 容器扮演着核心角色,本文将深入分析 Spring 源码,了解 IOC ...

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

    本文将深入剖析Spring 5.2.9版本中自定义标签的解析过程,旨在帮助读者理解Spring内部的工作机制。 首先,我们了解自定义标签的基本概念。在Spring中,自定义标签通常是通过实现`org.springframework.beans.factory...

    Spring Bean实例化实现过程解析

    Spring Bean 实例化实现过程解析 Spring Bean 实例化是 Spring 框架中一个非常重要的概念,它直接关系到 Bean 的生命周期和管理。在 Spring 框架中,Bean 的实例化是通过容器来管理的,容器会根据配置文件中的信息...

    Spring Bean生命周期&BeanDefinitions1

    这些信息在容器启动时解析并转化为BeanDefinition对象,后续的Bean实例化和管理都是基于这些定义进行的。 总的来说,Spring Bean的生命周期是高度可定制的,开发者可以通过实现接口、配置属性等方式控制Bean的行为...

    Spring中与Bean相关的接口

    例如,当使用`XmlBeanFactory`从XML配置文件加载Bean定义时,`BeanFactory`会解析并加载配置,但不会立即创建Bean。 接着,`ApplicationContext`是`BeanFactory`的一个扩展,它添加了更多企业级功能,如消息支持、...

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

    在Spring框架中,自定义标签的解析过程是一个关键的组件,它使得开发者能够通过XML配置文件以更加直观和简洁的方式声明Bean的定义。本节将深入探讨Spring 5.2.9版本中自定义标签的解析机制,以及背后的源码实现。 ...

    深度解析spring容器管理bean

    在创建Bean的过程中,Spring会使用DOM4J解析XML配置文件,DOM4J是一个强大的Java文档处理库,可以方便地读取、修改和操作XML文档。在Spring的配置文件中,我们定义了Bean的元数据,包括Bean的类名、属性、依赖关系等...

Global site tag (gtag.js) - Google Analytics