Spring配置文件解析

Spring源码解析之配置文件的解析 此篇博客篇幅较长,请耐心阅读,可能我文笔不太好,但是请仔细看博客中的代码的注释和说明,这样能帮助你理解。有什么问题可以回复。   直接进入正题,在使用Spring时,我们经常要进行大量的配置来告诉Spring,我们需要什么样的功能。但是配置文件又是怎么被Spring解析变成Spring所需要的东西呢。   Spring中有一个接口类,名叫BeanDefinition,配置文件中的<bea... 阅读详情

解析配置

解析配置,是Dubbo服务启动的第一步,基于Spring配置结合的框架都是从这一步开始启动的(包括之前提到的Motan);
Dubbo官方文档中提到:

初始化过程的第一步是从解析服务开始的,基于 dubbo.jar 内的 META-INF/spring.handlers 配置,
Spring 在遇到 dubbo 名称空间时,会回调 DubboNamespaceHandler。所有 dubbo 的标签,都统一用 DubboBeanDefinitionParser 进行解析,基于一对一属性映射,将 XML 标签解析为 Bean 对象。

真正想了解一只青蛙,传统的解剖不是办法,更好的方式是构造一只青蛙

所以想要了解这个过程,最好的方式是实现一个这样的过。
试想,在使用Dubbo的时候,配置各种标签:dubbo:application、dubbo:protocol、dubbo:service 等等;这些配置最终是如何转化成Dubbo框架的对象的;本文将试着照虎画猫,实现这样的一个功能。

目标:不使用传统的<bean>配置,使用自己定义的标签和命名空间来创建一个自定义的对象

创建MAVEN项目

创建项目过程,此处略过,增加spring的依赖:

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>4.3.8.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.8.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.3.8.RELEASE</version>
    </dependency>

创建目标对象

也就是我们需要通过xml配置,生成出什么类型的对象,此处略过;

创建XML约束文件xsd:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://www.irvingsun.cn/schema/foo"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.irvingsun.cn/schema/foo">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
    <xsd:import namespace="http://www.springframework.org/schema/beans"/>
    <xsd:import namespace="http://www.springframework.org/schema/tool"/>
    <xsd:complexType name="abstractPerson">
        <xsd:attribute name="id" type="xsd:string" use="required"/>
        <xsd:attribute name="firstname" type="xsd:string" use="required" />
        <xsd:attribute name="lastname" type="xsd:string" use="required" />
        <xsd:attribute name="age" type="xsd:int" use="required" />
        <xsd:attribute name="gender" type="xsd:string" use="required"/>
        <xsd:attribute name="address" type="xsd:string" />
    </xsd:complexType>
    <xsd:element name="person" type="abstractPerson"/>
</xsd:schema>

这个约束文件表示,我们需要创建一个名为person的标签,它有id、firstname、lastname、age等属性。该文件位于resources/META-INF/目录下。
同时在改目录下创建spring.schemas文件,该文件将告知spring,约束文件映射的本地具体位置,如果找不到,它将访问这个http地址查找;
http://www.irvingsun.cn/schema/foo.xsd=META-INF/foo.xsd

编写XML配置

此时,我们就可以通过这个xsd文件约束来创建XML配置文件了:

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:foo="http://www.irvingsun.cn/schema/foo"
      xmlns="http://www.springframework.org/schema/beans"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
      http://www.irvingsun.cn/schema/foo http://www.irvingsun.cn/schema/foo.xsd">

    <foo:person id = "idx" firstname="sun" lastname="way" age="1" gender="male" />

</beans>

我们配置了一个person标签,并且给属性赋值;

通过Spring自动解析

  • 创建Namespace解析处理器
public class PersonNamespaceHandler extends NamespaceHandlerSupport{
    public void init() {
        registerBeanDefinitionParser("person", new FooBeanDefinitionParser(Person.class, true));
    }
}

此处注册了一个BeanDefinition解析器,用来解析person标签:

public class FooBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
    protected Class getBeanClass(Element element) {
        return Person.class;
    }
    protected void doParse(Element element, BeanDefinitionBuilder bean) {
            String firstName = element.getAttribute("firstname");
            String lastName = element.getAttribute("lastname");
            String age = element.getAttribute("age");
            String id = element.getAttribute("id");
            String address = element.getAttribute("address");

        if(!StringUtils.isEmpty(firstName)){
            bean.addPropertyValue("firstName",firstName);
            }
            if(!StringUtils.isEmpty(lastName)){
                bean.addPropertyValue("lastName",lastName);
            }
            if(!StringUtils.isEmpty(id)){
                bean.addPropertyValue("id",id);
            }
            if(!StringUtils.isEmpty(address)){
                bean.addPropertyValue("address",address);
            }
            if(!StringUtils.isEmpty(age)){
                bean.addPropertyValue("age",Integer.parseInt(age));
            }
    }
}

从Element对象中加载出我们配置的值,并且返回BeanDefinition对象(父类中);

使用配置

和平时使用Spring的方式一样,通过加载XML配置文件:

public static void main( String[] args )
    {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"spring-config.xml"});
//        context.start();
        context.getBean(Person.class);
    }

回到开始时提到的,和Spring集成的情况,Dubbo启动,根据这种方式来将我们配置的参数,实例化为框架中对应的对象。

-EOF-

spring 读取配置文件源码解析 在spring中使用属性文件的流程相信大家都知道,只要使用<context:property-placeholder /> 标签将属性文件加载进来就可以了,然后在需要的时候通过表达式${key:默认值} 就可以获取到值了,很方面,这里就来分析spring在源码层面是如何做到的。1.context:property-placeholder标签解析使用spring首先是从解析xml的配置文件开始,spr 阅读详情

相关推荐

《Spring》第九篇 XML配置文件的解析过程

1. 当启动ClassPathXmlApplicationContext容器时, 为指定的BeanFactory创建一个XmlBeanDefinitionReader阅读器。 源码: AbstractXmlApplicationContext.loadBeanDefinitions() /** * Loads the bean definitions via an XmlBeanDefinitionReader. * * @see org.springframework.beans.factor

入坑太深起不来 651

Springboot配置视图解析器

Springboot中怎么配置视图解析器

weixin_56324141的博客 6645

Spring源码分析3 — spring XML配置文件的解析流程

1 介绍创建并初始化spring容器中,关键一步就是读取并解析spring XML配置文件。这个过程比较复杂,本文将详细分析整个流程。先看涉及到的关键类。XmlWebApplicationContext:web应用的默认Spring容器XmlBeanDefinitionReader:读取XML并解析xml文件DocumentLoader:文件先被读取为了原始的输入流InputStream,然后封装为

谢杨易的博客 1万+

【Spring实战】----Spring配置文件的解析

一、背景知识 Spring的核心的核心就是bean的配置及管理,至Spring最新发布的版本4.3.2已经有三种方式可以配置bean: 1)在XML中进行显示配置 2)在Java中进行显示配置 3)隐式的bean发现机制和自动装配 上述三种配置不展开说明,而且目前用的较多的是第3种(当然XML配置文件的使用仍然占据了不可替代的位置),可参考《Spring in Aciton 第四版》。但

honghailiang的专栏 1万+

HDMI2.1/eDP TX接口设计:

HDMI2.1向下兼容,HDMI2.1工作在FRL模式,HDMI2.0工作在TMDS模式。因此采用AC耦合电压模式驱动器。一般采用220nF,封装建议0201。,但是协议要求,往 CEC 管脚通过 27K 电阻加 3.3V 电压,漏电不允许超过。NOTE:如果只需要支持 HDMI2.0 及以下模式时, MOS管也不能省掉。DDC_SCL/DDC_SDA 协议规定是。HDMI2.0模式:配置为高,MOS导通。HDMI2.1模式:配置为低,MOS不导通。,必须增加电平转换电路。形成直流偏置,大约3V。

qq_40010777的博客 7857

全网最全医学图像数据汇总

本仓库汇总了多个领域的医学图像开源数据集,涵盖CT、MRI、超声、内窥镜、病理、多模态、PET、OCT以及皮肤镜等多种成像技术。每个数据集均详细列出了任务类型、部位、格式、数量及下载链接,旨在为医学图像研究者提供便捷的资源导航。⚠️:这些数据集仅适用于学术研究用途。

2401_83173765的博客 3319

Spring Boot 读取配置文件的几种方式

Spring Boot 读取配置文件的方式可以分为 1. 注解 2. 获取 Spring Boot 的环境变量 来获取配置文件的信息,其中注解的方式又有集中表现形式。第一步:创建 Spring Boot 工程( Maven 工程添加 Spring Boot 相应的依赖)。 现在我们只是测试 Spring Boot 的 配置文件的读取,不需要其他的依赖,所以什么都没选,直接下一步

DingSJ 的博客 12万+

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

VBA学习笔记6:将多个工作表中满足条件的数据汇总到同一个工作表

weixin_45355881的博客 4708

SpringBoot读取配置文件的两种方式以及自定义配置文件的读取

1.读取默认配置文件中的数据 application.properties 直接使用@Value注解获取数据 2.使用Environment获取数据 防止乱码统一编码格式 注入Environment 使用getProperty获取数据 3.读取自定义配置文件中的数据 自定义配置文件 加载自定义配置文件实体类并生成set和get方法

散步的博客 1万+

LAP-D协议概述

Q.921协议由称为LAPD(链路访问协议-D通道),与HDLC的关系密切,它是在ISDN D通道上使用的数据链路协议。 注:http://www.freesoft.org/CIE/Topics/125.htm LAP-D的帧格式 标志、位填充技术和FCS校验计算与HDLC一致。 16位的地址包括C/R字段、SAPI(服务访问点标识)和TEI(端点标识)。TEI用于区分使用相同ISDN...

系统运维 1914

使用ST-LINK烧录stm32教程说明

使用ST-LINK烧录stm32

qq_34426854的博客 1万+

Spring读取配置文件的几种方式

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; import java.util.Properties; import org.junit.Test;...

大大肉包博客 1089

用宝塔面板+CentOS 7.6,30分钟搞定DNF手游私服搭建(附全套资源下载)

本文详细介绍了如何使用宝塔面板和CentOS 7.6在30分钟内快速搭建DNF手游私服。通过图形化界面操作,无需复杂命令,即可完成服务端部署、MySQL数据库配置及客户端适配,适合Linux新手快速上手。

weixin_33737774的博客 598

Spring源码解析(3)——解析配置文件

回顾上篇 上篇文章读取配置文件中,我们已经分析到spring如何读取配置文件(BeanFactoryTest.xml),并最终把配置文件转换成Document 对象。接下来Spring会去解析Document 对象,并创建一个BeanDefinition,将解析出来的信息放到BeanDefinition中。然后将BeanDefinition注册到Spring中。接下来我们就跟着源码,看看Spring是如何来实现的。 分析源码实现 首先我们debug一下,看看解析配置文件创建出来的BeanDefinition

tack_back的博客 301

【原创】关于西门子S120 的电气图纸设计

我们首先要了解一下模块的基本信息:SINAMICS 功率模块 PM240-2 三相交流380-480V+10/-10% 47-63Hz;至此,我们选择的驱动系统配置的资料都已经查找完毕,接下来就是根据每个部件的功能接口和我们需要实现的功能画出接线连接图,这样关于伺服电机控制,硬件部分设计就完成了。2)FSA - FSC 型功率模块 PM240-2 的屏蔽连接板外形尺寸图,所有数据以毫米(英寸)为单位。1)FSA 型功率模块 PM240-2 的外形尺寸图,所有数据以毫米(英寸)为单位。

Qinmingyue13的博客 2638

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

FANUC机器人S523 新款PN板卡与西门子PLC通信配置介绍

Robot_PLC_HMI_Automation 354

Spring解析配置文件乞丐版

仿Spring解析配置文件乞丐版 package com.ruide.spring; import java.io.InputStream; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.HashMap; import ja...

xiao_xiao_b的博客 210

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

spring 配置文件_Spring源码分析2 — spring XML配置文件的解析流程

1 介绍创建并初始化spring容器中,关键一步就是读取并解析spring XML配置文件。这个过程比较复杂,本文将详细分析整个流程。先看涉及到的关键类。XmlWebApplicationContext:web应用的默认Spring容器XmlBeanDefinitionReader:读取XML并解析xml文件DocumentLoader:文件先被读取为了原始的输入流InputStream,然后封装...

weixin_39799646的博客 256

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

spring解析配置文件的过程

4.开始解析,他解析有分成两种方法,一种是默认的标签格式,另一种是自定义的,包括我们自己自定义的标签和spring自定义的标签,比如 <context>标签也是spring自定义的。6. 在doLoadDocument()里,会进行解析和转换,其中包括了是用xsd还是dtd方式进行验证,一般都是xsd见得多,将解析完的流转成对象方便后续使用。2.到了这个doParse()do开头的方法,就是干活的,处理标签的逻辑,如果是自定义的,他会到你自己定义的哪个类去处理。在自己重写的方法里,处理标签,给值。

qq_52918321的博客 314

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

spring xml 配置文件中标签的解析

一个springmvc配置文件的例子为: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:con...

weixin_30414155的博客 155

Spring 解析 XML 配置文件的过程(从读取 XML 到生成 BeanDefinition)

《Spring框架XML配置解析机制详解》 摘要:本文深入剖析Spring框架中XML配置文件的解析过程,从资源加载到BeanDefinition注册的全流程。文章详细讲解了ResourceLoader定位资源、XmlBeanDefinitionReader创建、DOM树解析、BeanDefinition生成等核心环节,并重点分析了自定义命名空间的处理机制。

持续输出Java相关知识 1536

Spring源码深度解析:四、Spring配置文件加载流程

接下来我们学习Spring配置文件加载流程,主要加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinitionAbstractApplicationContext#obtainFreshBeanFactory() 首先我们debug进入spring的刷新方法,接着进入子方法该方法先创建容器对象:,然后加载xml配置文件的属性值到当前工厂中,最重要的就是BeanDefinition。具体代码如下: AbstractApplicationContext#refreshBeanFactory()

知行 2950

Spring源码解析——配置文件解析

Spring配置文件解析过程中涉及的类图如下:   Spring配置文件解析的入口是BeanDefinitionReader接口,该接口最重要的实现是XmlBeanDefinitionReader类。 XmlBeanDefinitionReader的核心方法如下: protected int doLoadBeanDefinitions(InputSource inputSource, R...

根号三 738

1、Spring DI xml配置文件方式解析原理

前几天看了Spring DI部分的源码,今天写个简单的博客记录自己的学习路程。首先准备解析的xml文件和java代码:&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/sprin...

hl15067133528的博客 378

Spring Boot 配置文件深度解析

本文深入探讨了 Spring Boot 配置文件的核心作用及其主流格式。通过对比 Properties 与 YAML (YML) 的语法差异、优先级及适用场景,结合 @Value 与 @ConfigurationProperties 注解的代码实战,帮助开发者掌握配置读取的高级技巧。文章最后通过一个“图形验证码”综合案例,演示了如何将配置项优雅地集成到实际业务中。

此人很懒,什么都留下了...快进来看看吧 2128

Spring Boot 配置文件解析

SpringBoot 使用一个全局的配置文件,配置文件名固定的;配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好;YAML:是一个标记语言:不是一个标记语言;标记语言:以前的配置文件;大多都使用的是xxxx.xml文件;YAML:以数据为中心,比jsonxml等更适合做配置文件;

m0_62923286的博客 1047
上一篇: Spring Boot初体验
下一篇: Motan服务的启动
闰六月
博客等级 码龄11年 16粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值