美文网首页
Spring—自定义标签

Spring—自定义标签

作者: 康俊1024 | 来源:发表于2019-09-17 09:53 被阅读0次

    前言

    我们应该都知道Spring的常规标签,如bean,事务,Aop等等。随着满足业务的需求,同时降低程序员的工作量,我们有时需要自己定制一些标签。

    自定义标签

    Spring自定义标签需要如下几步:
    1.创建需要扩展的组件;
    2.定义xsd文件描述组件内容;
    3.创建一个文件,实现BeanDefinitionParser接口,用来解析xsd文件中的定义和组件定义;
    4.创建Handler文件,扩展字NamespaceHandlerSupport,目的是将组件注册到Spring容器;
    5.编写Spring.handlers和Spring.schemas文件;

    案例实践

    1.创建需要扩展的组件

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

    2.定义一个xsd文件描述组件内容
    在目录src/main/resources/META-INF/下创建 user.xsd文件

    <?xml version="1.0" encoding="UTF-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/schema/user"
            xmlns:tns="http://www.example.org/schema/user" elementFormDefault="qualified">
        <element name="users">
            <complexType>
                <attribute name ="id" type = "string"/>
                <attribute name ="userName" type = "string"/>
                <attribute name ="email" type = "string"/>
            </complexType>
        </element>
    </schema>
    

    文件schema 便签有一个targetNamespace属性,并且创建了一个element users,里面有三个attribute。
    主要是为了验证Spring配置文件中的自定义格式。也就是,Spring位置文件中使用的users自定义标签中,属性只能是上面的三种,有其他的属性的话,就会报错。
    3.创建文件,实现BeanDefinitionParser接口,用来解析xsd文件中的定义和组件定义

    public class UserBeanDefinitionParser extends AbstractSingleBeanDefinitionParser {
    
        @SuppressWarnings("rawtypes")
        protected Class getBeanClass(Element element) {
            return User.class;
        }
        
        protected void doParse(Element element, BeanDefinitionBuilder bean) {
            String userName = element.getAttribute("userName");
            String email = element.getAttribute("email");
            if (StringUtils.hasText(userName)) {
                bean.addPropertyValue("userName", userName);
            }
            if (StringUtils.hasText(email)){
                bean.addPropertyValue("email", email);
            } 
            
        }
    }
    

    4.创建Handler文件,扩展自NamespaceHandlerSupport,目的是将组件注册到Spring容器中

    public class MyNamespaceHandler extends NamespaceHandlerSupport {
    
        public void init() {
            registerBeanDefinitionParser("users", new UserBeanDefinitionParser());
        }
    
    }
    

    5.编写Spring.handlers和Spring.schemas文件
    前提须知:\ 是转义字符的概念。
    在目录src/main/resources/META-INF/下创建Spring.handlers文件

    http\://www.example.org/schema/user=com.kangjun.springframework.service.MyNamespaceHandler
    

    在目录src/main/resources/META-INF/下创建Spring.schemas文件

    http\://www.example.org/schema/user.xsd=META-INF/user.xsd
    

    6.创建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:user="http://www.example.org/schema/user"
           xsi:schemaLocation="http://www.springframework.org/schema/beans       http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.example.org/schema/user http://www.example.org/schema/user.xsd">
    
        <user:users id = "user" userName = "kangjun" email = "123456"/>
    </beans>
    

    引入xmlns:user对应的命名空间,它会到http://www.example.org/schema/user.xsd找到对应xsd文件进行check。再到Spring.schemas里去参照。
    7.测试用例

    public class Demo {
        public static void main(String[] args) {    
            ApplicationContext beans=new ClassPathXmlApplicationContext("classpath:test.xml");    
            User user=(User)beans.getBean("user");
            System.out.println("username:"+user.getUserName()+"  "+"email:"+user.getEmail());    
        }    
    }
    username:kangjun  email:123456
    

    相关文章

      网友评论

          本文标题:Spring—自定义标签

          本文链接:https://www.haomeiwen.com/subject/acequctx.html