​spring自定义标签

8 篇文章 0 订阅

如何将自定义的配置标签化是个比较通用的问题,spring已经很好的帮我们设计完成,只需要我们去实现。将繁琐的配置通过xml配置,spring自动转换成bean,整个过程比较合理。


1.创建一个需要扩展的组件

package com.bean;

public class User {
    private String userName;
    private String email;
    private String address;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
2.定义一个XSD文件描述组件内容

spring-user.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.lcq.com/schema/user"
        xmlns:tns="http://www.lcq.com/schema/user" elementFormDefault="qualified">
    <element name="user">
        <complexType>
            <attribute name="id" type="string" />
            <attribute name="userName" type="string" />
            <attribute name="email" type="string" />
            <attribute name="address" type="string" />
        </complexType>
    </element>
</schema>
3.实现BeanDefinitionParser接口,解析XSD文件中的定义和组件定义

package com.parse;

import com.bean.User;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;

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

    @Override
    protected void doParse(Element element, BeanDefinitionBuilder bean) {
        String userName = element.getAttribute("userName");
        String email = element.getAttribute("email");
        String address = element.getAttribute("address");

        if (StringUtils.hasText(userName)) {
            bean.addPropertyValue("userName", userName);
        }
        if (StringUtils.hasText(email)) {
            bean.addPropertyValue("email", email);
        }
        if (StringUtils.hasText(address)) {
            bean.addPropertyValue("address", address);
        }
    }
}
4.创建Handler文件,扩展自NamespaceHandlerSupport,将组件注册到Spring容器

package com.tag;

import com.parse.UserDefinitionParser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

public class UserNamespaceHandler extends NamespaceHandlerSupport {
    @Override
    public void init() {
        registerBeanDefinitionParser("user",new UserDefinitionParser());
    }
}
5.编写Spring.handlers和Spring.schemas映射文件

spring.handlers

http\://www.lcq.com/schema/user=com.tag.UserNamespaceHandler

Spring.schemas

http\://www.lcq.com/schema/user.xsd=META-INF/spring-user.xsd
6.测试

package com.test;

import com.bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {
    public static void main(String[] args) {
        ApplicationContext ac = new ClassPathXmlApplicationContext("demo.xml");
        User user = (User) ac.getBean("userBean");
        System.out.println(user.getUserName());
    }

}

运行输出lcq







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值