Spring的XML扩展特性

Spring 框架从 2.0 版本开始,提供了基于 Schema 风格的 XML 扩展机制,允许开发者扩展最基本的 Spring 配置文件(一般是 classpath 下的 spring.xml)。

试想一下,如果我们直接在 spring.xml 中加入一个自定义标签,会发生什么呢?Spring 框架启动的时候会报错,因为 Spring 根本不认识我们自定义的,这样对 spring.xml 的校验就会失败,最终结果就是框架不能启动。有什么方法,能够让 spring 认识并加载解析我们自定义的呢?这就是 Spring 提供的 xml 扩展机制。我们可以在 spring.xml 中加入自己的标签,之后 Spring 会帮我们解析并纳入自己的管理范围内,这也就是说我们扩展了spring的功能。

现在我们来看下怎么实现这个功能,可以参考 Spring 帮助文档中的 extensible-xml.html。我们知道如果在需要在 spring.xml 中配置数据源,需要进行如下的配置:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">       
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />      
    <property name="url" value="jdbc:mysql://localhost:3309/sampledb" />      
    <property name="username" value="root" />      
    <property name="password" value="1234" />      
</bean>

这种方式配置虽然也比较简单,但是有一个缺点:使用标签不够明显,不如元素属性那么直接。现在我们希望在 spring.xml 中做如下的配置,就能够完成数据源的配置。

<aty:datasource id="myDataSourcce" 
url="jdbc:mysql://localhost:3309/demodb" userName="root" password="root" />

这种方式比较直接,配置不容易出错。如果让 spring 能够解析这个标签,需要4步。

1. 提供一个 xsd 文件,负责对 xml 的标签进行校验

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.aty.com/schema/aty" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:beans="http://www.springframework.org/schema/beans"
    targetNamespace="http://www.aty.com/schema/aty" 
    elementFormDefault="qualified"
    attributeFormDefault="unqualified">

    <xsd:import namespace="http://www.springframework.org/schema/beans" />

    <xsd:element name="datasource">
        <xsd:complexType>
            <xsd:complexContent>
                <xsd:extension base="beans:identifiedType">
                    <xsd:attribute name="url" type="xsd:string" use="required" />
                    <xsd:attribute name="userName" type="xsd:string" use="required" />
                    <xsd:attribute name="password" type="xsd:string" use="required" />
                </xsd:extension>
            </xsd:complexContent>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

2. 定义一个 BeanDefinitionParser 负责解析 xml,并将必要的信息放入 spring 中

package net.aty.custom.define;

This chapter requires login to view full content. You are viewing a preview.

Login to View Full Content

Course Curriculum

3

框架与 I/O:Spring、Netty 与 Web 容器

理解 Spring Boot 自动装配、AOP 与事务原理,掌握 Netty Reactor 模型及 Tomcat 连接处理机制,构建高内聚、易扩展的应用服务层。
4

高性能中间件:消息、缓存与存储

熟练运用 MySQL 索引/事务、Redis 缓存策略、Kafka/RocketMQ 消息可靠性,以及 ZooKeeper 分布式协调,搭建稳定、解耦的分布式数据底座。
6

云原生:容器化、可观测性与工程效能

通过 Docker/K8s 实现弹性部署,集成 Metrics/Logs/Traces 构建可观测体系,推动 DevOps 与自动化,让架构在云上持续交付与进化。