`

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源码解析.zip

    本压缩包“Spring源码解析”提供了对Spring框架核心组件——IOC(Inversion of Control,控制反转)、AOP(Aspect Oriented Programming,面向切面编程)以及Transaction(事务管理)的源码分析,帮助开发者更全面地...

    Spring bean生命周期demo

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

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

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

    Spring源码分析.pdf

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

    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版本中自定义标签的解析机制,以及背后的源码实现。 ...

Global site tag (gtag.js) - Google Analytics