Spring源码之XML文件中Bean标签的解析1

这篇具有很好参考价值的文章主要介绍了Spring源码之XML文件中Bean标签的解析1。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

读取XML文件,创建对象

xml文件里包含Bean的信息,为了避免多次IO,需要一次性读取xml文件中所有bean信息,加入到Spring工厂。

读取配置文件
new ClassPathResource("applicationContext.xml")

ClassPathResource是Spring封装的一个类型;

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

Resource接口 :可以读取相关资源文件的内容 获得输入流;可读取的类型,不仅包括本地的xml、 properties、txt 等文件,还包括 网络中的资源。它有父接口,InputStreamSource,其中定义了一个getInputStream方法,用来获取输入流。

ClassPathResource类中对getInputStream方法的实现。

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

Resource将xml配置文件读取到jvm中,那jvm中是如何体现xml中的bean呢?

因为一切皆对象,所以肯定是以对象的方式存在的。标签就会以BeanDefinition对象的方式存在于jvm中。

Spring通过SAX的技术手段,对xml解析,封装BeanDefiniton。

IOC的核心

下方代码所代表的含义,实际上就是IOC的核心:

BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));

它包括以下几个问题:

  1. 怎么读取配置文件 获得IO资源
  2. 读取配置文件后,如何在Spring中以对象的形式进行封装
  3. 根据配置信息创建对象
  4. 所创建对象的生命周期
怎么读取配置文件 获得IO资源

通过Resource接口的实现类,比如ClassPathResource,得到InputStream。

读取配置文件后,如何在Spring中以对象的形式进行封装

以BeanDefinition的形式存在,用的最多的实现类是GenericBeanDefinition。

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

Spring底层如何通过读取 XML 封装成BeanDefinition呢

使用XmlBeanFactory中的XmlBeanDefinitionReader对象的方法。

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

Spring标识XmlBeanFactory过期了,可以用以下代码替换:

DefaultListableBeanFactory beanFactory1 = new DefaultListableBeanFactory();
Resource resource = new ClassPathResource("applicationContext.xml");
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory1);
xmlBeanDefinitionReader.loadBeanDefinitions(resource);

Object product1 = beanFactory1.getBean("product"); 
System.out.println("product1 = " + product1);

但是比较繁琐,我们分析源码还是使用XmlBeanFactory来分析。

Spring底层如何做到通过XmlBeanDefinitionReader读取 XML封装成BeanDefinition呢?

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

Spring允许在一个工程中有多个Spring工厂同时出现 ,但是情况非常少见 。

比如SpringMVC中 父子容器
DispatcherServlet ---- childFactory
ContextLoaderListener ---- rootFactory

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

InputStream inputStream = encodedResource.getResource().getInputStream();
这行代码是封装成SAX的InputStream类型,对xml进行解析。
最主要的就是return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
来加载BeanDefinition。

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

Document doc = doLoadDocument(inputSource, resource);
这行代码得到的还是XML解析封装的对象。
int count = registerBeanDefinitions(doc, resource);
这行代码就是注册BeanDefinition的方法,并返回注册的数量。

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

parseDefaultElement(ele, delegate);用来解析基本标签
	比如:
		<bean id="" class="" scope="" parent="" init-method=""
            <property name  value
          </bean>
         <bean id="" class="" scope="" parent="" init-method=""
            <construt-arg>
         </bean>
delegate.parseCustomElement(ele);解析自定义标签
	比如:
	<context:propertyplace-holder
    <context:component-scan
    ..
    <tx:annotation-driven
    <mvc:annotation-drvent
    <aop:config

我们目前看基本标签的解析;

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

  • import标签

    可以引入其他的配置文件
    <import resource="applicationContext1.xml"/>
    <import resource="applicationContext2.xml"/>
    <import resource="applicationContext3.xml"/>
    
  • alias标签

    别名
    <bean id="product" name= "p"  class="xxxx.xxx.Product"/>
    	name代表别名
    也可以这样写
    <bean id="user"  class="xxxx.xxx.User"/>
    <alias name="user" alias="u"/>
    alias标签也可以写别名
    
  • beans标签上文已经讲过

  • bean标签——用的最多,着重分析

    Spring源码之XML文件中Bean标签的解析1,spring,xml,java

    BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
    	解析标签里的元素,封装成BeanDefinitionHolder
        (对BeanDefinition做了一层包装)
        其中有三个属性
        private final BeanDefinition beanDefinition;
        存储BeanDefinition
    
        private final String beanName;
        存储id值,如果没有id,就是name值
        如果也没有name,会自动生成一个
    
        private final String[] aliases;
        存储别名
    	
    bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
    	如果有自定义标签,再解析自定义标签
    
    BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
    	将BeanDefinition,以id为key存储到map中
    
    getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
    	发送注册完成的事件;此方法是空实现,可以自己实现
    
    parseBeanDefinitionElement重载1
    此方法用来解析id、别名,判断id是否唯一、调用parseBeanDefinitionElement重载2;若id,name都没有,生成id等操作。
    

Spring源码之XML文件中Bean标签的解析1,spring,xml,java

parseBeanDefinitionElement重载2
此方法用来解析class标签,创建BeanDefinition、解析scope、abstract标签等。

Spring源码之XML文件中Bean标签的解析1,spring,xml,java文章来源地址https://www.toymoban.com/news/detail-636233.html

到了这里,关于Spring源码之XML文件中Bean标签的解析1的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring之Bean生命周期源码解析

    Spring之Bean生命周期源码解析

    ClassPathBeanDefinitionScanner.java ClassPathScanningCandidateComponentProvider.java 通过组件索引寻找 这里的 componentsIndex 在初始化的时候会尝试解析 META-INF/spring.components 文件中的配置信息 把断点打在 ClassPathScanningCandidateComponentProvider 的 setResourceLoader 方法上调试可以看到堆栈 可以看到,的确

    2024年02月11日
    浏览(10)
  • 【框架源码】Spring源码解析之Bean生命周期流程

    【框架源码】Spring源码解析之Bean生命周期流程

    观看本文前,我们先思考一个问题,什么是Spring的bean的生命周期?这也是我们在面试的时候,面试官常问的一个问题。 在没有Spring之前,我们创建对象的时候,采用new的方式,当对象不在被使用的时候,由Java的垃圾回收机制回收。 而 Spring 中的对象是 bean,bean 和普通的 J

    2024年02月09日
    浏览(9)
  • logback-spring.xml配置文件标签(超详解)

    logback-spring.xml配置文件标签(超详解)

    市面上的日志框架; JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j… 日志门面 (日志的抽象层) 日志实现 JCL(Jakarta Commons Logging) SLF4j(Simple Logging Facade for Java) jboss-logging Log4j JUL(java.util.logging) Log4j2 Logback SpringBoot选用 SLF4j(日志抽象层)和logback(日志实现) 官方图:

    2023年04月09日
    浏览(42)
  • 【深入Spring源码解析:解密Bean的生命周期】

    Spring是Java企业级应用开发领域的一颗明星,它提供了很多方便开发人员的工具和思想。在分布式系统中,Spring的分布式远程协作方案,比如REST、Web服务以及消息传递等,也是不可或缺的。 你知道吗?在我们使用Spring时,容器中存放的所有对象,在Spring启动的时候就完成了实

    2024年02月05日
    浏览(11)
  • 【Spring专题】Spring之Bean的生命周期源码解析——上(扫描生成BeanDefinition)

    【Spring专题】Spring之Bean的生命周期源码解析——上(扫描生成BeanDefinition)

    由于Spring源码分析是一个前后联系比较强的过程,而且这边分析,也是按照代码顺序讲解的,所以不了解前置知识的情况下,大概率没办法看懂当前的内容。所以,特别推荐看看我前面的文章(自上而下次序): Spring底层核心原理解析——引导篇【学习难度: ★★☆☆☆ 】

    2024年02月13日
    浏览(6)
  • 【Spring专题】Spring之Bean的生命周期源码解析——阶段一(扫描生成BeanDefinition)

    【Spring专题】Spring之Bean的生命周期源码解析——阶段一(扫描生成BeanDefinition)

    由于Spring源码分析是一个前后联系比较强的过程,而且这边分析,也是按照代码顺序讲解的,所以不了解前置知识的情况下,大概率没办法看懂当前的内容。所以,特别推荐看看我前面的文章(自上而下次序): Spring底层核心原理解析——引导篇【学习难度: ★★☆☆☆ 】

    2024年02月13日
    浏览(8)
  • Spring源码解析(八):bean后置处理器CommonAnnotationBeanPostProcessor

    Spring源码解析(八):bean后置处理器CommonAnnotationBeanPostProcessor

    Spring源码系列文章 Spring源码解析(一):环境搭建 Spring源码解析(二):bean容器的创建、默认后置处理器、扫描包路径bean Spring源码解析(三):bean容器的刷新 Spring源码解析(四):单例bean的创建流程 Spring源码解析(五):循环依赖 Spring源码解析(六):bean工厂后置处理器ConfigurationCla

    2024年02月13日
    浏览(8)
  • 【Spring专题】Spring之Bean的生命周期源码解析——阶段二(IOC之实例化)

    【Spring专题】Spring之Bean的生命周期源码解析——阶段二(IOC之实例化)

    由于Spring源码分析是一个前后联系比较强的过程,而且这边分析,也是按照代码顺序讲解的,所以不了解前置知识的情况下,大概率没办法看懂当前的内容。所以,特别推荐看看我前面的文章(自上而下次序): Spring底层核心原理解析——引导篇【学习难度: ★★☆☆☆ 】

    2024年02月13日
    浏览(10)
  • 【Spring专题】Spring之Bean的生命周期源码解析——阶段二(二)(IOC之属性填充/依赖注入)

    【Spring专题】Spring之Bean的生命周期源码解析——阶段二(二)(IOC之属性填充/依赖注入)

    由于Spring源码分析是一个前后联系比较强的过程,而且这边分析,也是按照代码顺序讲解的,所以不了解前置知识的情况下,大概率没办法看懂当前的内容。所以,特别推荐看看我前面的文章(自上而下次序): Spring底层核心原理解析【学习难度: ★★☆☆☆ 】 手写简易

    2024年02月12日
    浏览(6)
  • Spring高手之路16——解析XML配置映射为BeanDefinition的源码

    Spring高手之路16——解析XML配置映射为BeanDefinition的源码

       Spring 框架中控制反转( IOC )容器的 BeanDefinition 阶段的具体步骤,主要涉及到 Bean 的定义、加载、解析,并在后面进行编程式注入和后置处理。这个阶段是 Spring 框架中 Bean 生命周期的早期阶段之一,对于理解整个 Spring 框架非常关键。 加载配置文件、配置类   在这

    2024年02月04日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包