Spring自定义标签解析

Spring自定义标签流程:

1、写个bean-->User

package fun.huanghai.bean;

public class User {

    private String userName;
    private String email;

    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;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

2、写个xsd文件-->Spring-test.xsd

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

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

3、写个类继承AbstractSingleBeanDefinitionParser

package fun.huanghai.config;

import fun.huanghai.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 UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {

    //Element对应的类
    protected Class getBeanClass(Element element){
        return User.class;
    }

    //从element中解析并提取对应的元素
    @Override
    protected void doParse(Element element, BeanDefinitionBuilder bean) {
        String userName = element.getAttribute("userName");
        String email = element.getAttribute("email");
        //将提取的数据放入到BeanDefinitionBuilder中,待到完成所有bean的解析后统一注册到beanFactory中
        if(StringUtils.hasText(userName)){
            bean.addPropertyValue("userName",userName);
        }
        if(StringUtils.hasText("email")){
            bean.addPropertyValue("email",email);
        }
    }
}

4、写个类继承NamespaceHandlerSupport 重写init() 方法

package fun.huanghai.config;

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

public class MyNamespaceHandler extends NamespaceHandlerSupport {

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

5、在工程目录下META-INF下写两个文件

--> Spring.handlers

http\://www.lexueba.com/schema/user=fun.huanghai.config.MyNamespaceHandler

--> Spring.schemas

http\://www.lexueba.com/schema/user.xsd=META-INF/Spring-test.xsd

6、在spring.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:myname="http://www.lexueba.com/schema/user"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.lexueba.com/schema/user http://www.lexueba.com/schema/user.xsd">


    <myname:user id="testbean" userName="aaa" email="bbb" />
</beans>

7、主程序运行

package fun.huanghai;

import fun.huanghai.bean.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {

    public static void main(String[] args){
        ApplicationContext application = new ClassPathXmlApplicationContext("classpath:spring.xml");

        User user = (User) application.getBean("testbean");
        System.out.println(user);
    }
}

8、运行结果:

发布了5 篇原创文章 · 获赞 0 · 访问量 121

猜你喜欢

转载自blog.csdn.net/u012939253/article/details/104883434