spring 自定义标签

该博客介绍了Java中自定义XML标签的编写步骤,包括编写测试实体类、定义xsd文件、编写spring.schemas和spring.handlers文件、编写BeanDefinition解析器和命名空间处理器、编写hero.xml及测试类等,各文件有相应的存放位置和作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写测试实体类

public class Hero {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
复制代码

定义xsd文件

文件命名为hero.xsd放在resources/META-INF/下面

<xsd:schema
        xmlns="http://www.ye.com/schema"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.ye.com/schema">
    <xsd:complexType name="elementname1complexType">
        <xsd:attribute name="name" type="xsd:string">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The elementname1 name. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
        <xsd:attribute name="age" type="xsd:int">
            <xsd:annotation>
                <xsd:documentation><![CDATA[ The elementname1 age. ]]></xsd:documentation>
            </xsd:annotation>
        </xsd:attribute>
    </xsd:complexType>

    <xsd:element name="elementname1" type="elementname1complexType">
        <xsd:annotation>
            <xsd:documentation><![CDATA[ elementname1的文档 ]]></xsd:documentation>
        </xsd:annotation>
    </xsd:element>
</xsd:schema>
复制代码
1. 定义targetNamespace(目标命名空间),xmlns的值要与这个相同
2. xsd:element定义的就是将来会在xml文件中用到的元素,例如中的application
3. xsd:attribute定义的就是模型类中的属性,例如中的name,并且可以指定属性类型,进而起到检测的作用(当我们定义的是int,如果在xml中的值是非int型的,直接会报错)

编写spring.schemas文件

放在resources/META-INF/下

http\://www.ye.com/schema/hero.xsd=META-INF/hero.xsd
复制代码

编写BeanDefinition解析器

作用:主要用来解析自定义的xml标签。

public class HeroBeanDefinitionParser implements BeanDefinitionParser{
    private final Class<?> beanClass;

    public HeroBeanDefinitionParser(Class<?> beanClass) {
        this.beanClass = beanClass;
    }

    @Override
    public BeanDefinition parse(Element element, ParserContext parserContext) {
        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClass(beanClass);
        beanDefinition.setLazyInit(false);
        beanDefinition.getPropertyValues().add("name", element.getAttribute("name"));
        beanDefinition.getPropertyValues().add("age", element.getAttribute("age"));
        BeanDefinitionRegistry beanDefinitionRegistry = parserContext.getRegistry();
        beanDefinitionRegistry.registerBeanDefinition(beanClass.getName(),beanDefinition);//注册bean到BeanDefinitionRegistry中
        return beanDefinition;
    }
}
复制代码

编写命名空间处理器

public class HeroNamespaceHandler extends NamespaceHandlerSupport {
    @Override
    public void init() {
        registerBeanDefinitionParser("elementname1", new HeroBeanDefinitionParser(Hero.class));
    }
}
复制代码

说明:通常为每一个xsd:element都要注册一个BeanDefinitionParser。

编写spring.handlers文件

放在resources/META-INF/下

http\://www.ye.com/schema=com.ye.xml.HeroNamespaceHandler
复制代码

编写hero.xml

<?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:hero="http://www.ye.com/schema"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
       http://www.ye.com/schema http://www.ye.com/schema/hero.xsd">
    <hero:elementname1 name="xiaona" age="18"/>
</beans>
复制代码

编写测试类

public class Test {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("hero.xml");
        Hero hero = (Hero) applicationContext.getBean(Hero.class.getName());
        System.out.println("name: " + hero.getName() + " age: " + hero.getAge());
    }
}
复制代码

转载于:https://juejin.im/post/5c933fb0f265da6102098997

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值