探索Spring XML扩展:自定义命名空间的原理与实践

命名空间

Spring XML 命名空间是一种用于定义和组织 XML 配置文件结构的机制,它允许在 XML 文件中引入特定命名空间以使用特定功能。通过引入命名空间,可以使用该命名空间所提供的标签和属性来配置 Spring 框架中的不同功能和组件。

在 Spring XML 配置文件中,命名空间通常通过 xmlns 属性来声明,例如 xmlns:contextxmlns:mvc 等。这些命名空间引入了特定功能的标签和属性,使得配置文件能够更加清晰地表达各种配置信息。

每个命名空间都有其独特的功能和对应的标签,例如 context 命名空间用于处理 Spring 应用上下文相关的配置,mvc 命名空间用于配置 Spring MVC 相关的组件,tx 命名空间用于配置事务管理等。

通过引入命名空间,Spring XML 配置文件可以更加模块化和可读性更强,使得配置更加灵活和清晰。在配置文件中,可以根据需要选择引入特定命名空间,并使用相应的标签和属性来配置 Spring 应用的各个方面。

Spring 配置文件

不引入任何命名空间的 Spring 配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" name="u;USER" class="world.xuewei.entity.User">
        <property name="userName" value="薛伟"/>
        <property name="password" value="123456"/>
    </bean>
</beans>

引入了其他命名空间的 Spring 配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       					   http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <bean id="user" name="u;USER" class="world.xuewei.entity.User">
        <property name="userName" value="薛伟"/>
        <property name="password" value="123456"/>
    </bean>

    <mvc:annotation-driven/>
</beans>

自定义命名空间

我们就以上面的 User 为例,开发一个自定义的命名空间。然后我们可以使用 <xw:user> 来定义 User Bean。

创建 META-INF

在 resources 目录下创建 META-INF 文件夹。

定义标签约束模板

在刚刚创建的 META-INF 文件夹中新建文件 user.xsd

注意:这里的 id 属性是必须的!

<?xml version="1.0" encoding="UTF-8" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://xuewei.world/schema/user"
        elementFormDefault="qualified">

    <element name="user">
        <complexType>
            <attribute name="id" type="string"/>
            <attribute name="userName" type="string"/>
            <attribute name="password" type="string"/>
        </complexType>
    </element>
</schema>

创建 spring.schemas

在刚刚创建的 META-INF 文件夹中新建文件 spring.schemas

http\://xuewei.world/schema/user.xsd=META-INF/user.xsd

修改 Spring 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xw="http://xuewei.world/schema/user"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://xuewei.world/schema/user http://xuewei.world/schema/user.xsd">

    <xw:user id="user" userName="薛伟" password="123456"/>
</beans>

可以看到,这里就可以成功引入我们自己定义的约束了!但是现在去运行肯定是会报错的,因为我们还没有创建 Handler。

我们可以运行一下,看看是报什么错。

创建 UserNamespaceHandler 类

package world.xuewei.handler;

import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

/**
 * 用户命名空间处理
 *
 * @author 薛伟
 */
public class UserNamespaceHandler extends NamespaceHandlerSupport {

    @Override
    public void init() {
        registerBeanDefinitionParser("user", new UserBeanDefinitionParser());
    }
}

创建 UserBeanDefinitionParser 类

package world.xuewei.handler;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.w3c.dom.Element;
import world.xuewei.entity.User;

/**
 * 用户 Bean 节点解析器
 *
 * @author 薛伟
 */
public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

    @Override
    protected Class<?> getBeanClass(Element element) {
        return User.class;
    }

    @Override
    protected void doParse(Element element, BeanDefinitionBuilder builder) {
        String userName = element.getAttribute("userName");
        String password = element.getAttribute("password");
        builder.addPropertyValue("userName", userName);
        builder.addPropertyValue("password", password);
    }
}

创建 spring.handlers

在刚刚创建的 META-INF 文件夹中新建文件 spring.schemas

http\://xuewei.world/schema/user=world.xuewei.handler.UserNamespaceHandler

测试程序

@Test
public void testDefaultListableBeanFactory() {
    // 创建工厂
    DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
    // 创建 XML 阅读器,并指定关联的工厂
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
    // 开始解析加载 Bean
    reader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml"));
    System.out.println(factory.getBean("user"));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值