Spring自定义标签

Spring自定义标签

Spring支持对自定义标签


自定义spirng配置文件标签实现以下效果:

<?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:mrpc="http://blog.csdn.net/pretent/schema/mnm"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://blog.csdn.net/pretent/schema/mnm 
    http://blog.csdn.net/pretent/schema/mnm.xsd">

    <mnm:annotation package="server.impl" />

</beans> 

定义约束文件xsd

需要在资源目录中/src/main/resources/META-INF/建立xsd文件

<xsd:schema xmlns="http://blog.csdn.net/pretent/schema/mnm"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
            targetNamespace="http://blog.csdn.net/pretent/schema/mnm" 
            elementFormDefault="qualified" 
            attributeFormDefault="unqualified">
    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />

    <xsd:element name="annotation">
        <xsd:complexType>
            <xsd:attribute name="package" type="xsd:string" />
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

指定XSD文件位置

需要在资源目录中建立/src/main/resources/META-INF/spring.schemas文件

http\://blog.csdn.net/pretent/schema/mnm.xsd=META-INF/mnm.xsd

指定自定义标签处理程序

需要在资源目录中建立/src/main/resources/META-INF/spring.handlers文件

http\://blog.csdn.net/pretent/schema/mnm=org.pretent.mrpc.support.handler.MnmNamespaceHandler

指定标签解析器

org.pretent.mrpc.support.handler.MnmNamespaceHandler

package org.pretent.mrpc.support.handler;

import org.pretent.mrpc.support.config.AnnotationConfig;
import org.pretent.mrpc.support.parer.MnmBeanDefinitionParser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;

public class MrpcNamespaceHandler extends NamespaceHandlerSupport {
    public void init() {
        registerBeanDefinitionParser("annotation", new MnmBeanDefinitionParser(AnnotationConfig.class));
    }
}

标签解析器

org.pretent.mrpc.support.parer.MnmBeanDefinitionParser

package org.pretent.mrpc.support.parer;

import org.pretent.mrpc.support.bean.ImplProxyBean;
import org.pretent.mrpc.support.bean.RegisterBean;
import org.pretent.mrpc.support.config.AnnotationConfig;
import org.pretent.mrpc.support.config.ProtocolConfig;
import org.pretent.mrpc.support.config.ReferenceConfig;
import org.pretent.mrpc.support.config.ServiceConfig;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.beans.factory.xml.BeanDefinitionParser;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;

/**
 * AbstractSingleBeanDefinitionParser
 *
 * @author pretent
 */
public class MnmBeanDefinitionParserimplements BeanDefinitionParser {

    private Class<?> clazz;

    public MnmBeanDefinitionParser(Class<?> clazz) {
        this.clazz = clazz;
    }

    public BeanDefinition parse(Element element, ParserContext parserContext) {
        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setLazyInit(false);
        String id = element.getAttribute("id");
        if (AnnotationConfig.class.equals(clazz)) {
            beanDefinition.setBeanClass(clazz);
            String packageName = element.getAttribute("package");
            beanDefinition.getPropertyValues().add("packageName", packageName);
        }
        if ((id == null || id.length() == 0)) {
            String name = element.getAttribute("name");
            if (name == null || name.length() == 0) {
                name = clazz.getName();
            }
            id = name;
        }
        parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);
        return beanDefinition;
    }
}

org.pretent.mrpc.support.config.AnnotationConfig

package org.pretent.mrpc.support.config;

public class AnnotationConfig {

    private String packageName;

    public String getPackageName() {
        return packageName;
    }

    public void setPackageName(String packageName) {
        this.packageName = packageName;
    }
}

使用

Spring 配置文件/src/main/resources/application.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:mrpc="http://blog.csdn.net/pretent/schema/mnm"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
    http://blog.csdn.net/pretent/schema/mnm 
    http://blog.csdn.net/pretent/schema/mnm.xsd">

    <bean id="orderService" class="server.impl.OrderServiceImpl" />

    <mnm:annotation package="server.impl" />

</beans>  

这样就可以直接<mnm:annotation package="server.impl" /> 把解析成一个AnnotationConfig 类型的bean对象了。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值