spring 中怎么创建自定义标签来简化bean的配置?

原先的bean配置如下:
<bean id="XXXX" class="XXX">
    <constructor-arg index="0">
        <list>
            <value>XXX</value>
        </list>
    </constructor-arg>
    <constructor-arg index="1" value="false" />
    <constructor-arg index="2">
        <ref bean="XXXXXX"/>
    </constructor-arg>
    <constructor-arg index="3" value="XXXXX"/>
    <constructor-arg index="4" value="false"/>
    <constructor-arg index="5" value="15000"/>
    <constructor-arg index="6" value="XXX"/>
</bean>


引入自定义标签后bean配置简化为:
<uni:client id="client1" configServerUrl="XXXXX" uniConfigListener="uniConfigListener" 
localDir="XXXX">
    <uni:groups>
        <uni:group>XXXXX</uni:group>
    </uni:groups>
</uni:client>
1、uni.xsd文件


<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://uni.xx.com/schema/uni"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            xmlns:beans="http://www.springframework.org/schema/beans"
            targetNamespace="http://uni.xx.com/schema/uni"
            elementFormDefault="qualified"
            attributeFormDefault="unqualified">


    <xsd:import namespace="http://www.springframework.org/schema/beans"/>


    <xsd:element name="client">
        <xsd:complexType>
            <xsd:all>
                <xsd:element name="groups">
                    <xsd:annotation>
                        <xsd:documentation><![CDATA[ 订阅的组的list  ]]></xsd:documentation>
                    </xsd:annotation>
                    <xsd:complexType>
                        <xsd:sequence>
                        <xsd:element name="group" type="xsd:string" minOccurs="1" maxOccurs="unbounded"/>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:all>
            <xsd:attribute name="id" type="xsd:ID" use="required">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[ Spring的BeanId ]]></xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>
            <xsd:attribute name="debug" type="xsd:boolean" use="optional" default="false">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[ 是否需要打印日志 ]]></xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>
            <xsd:attribute name="uniConfigListener" type="xsd:string" use="required">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[ 监听器实现类 ]]></xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>
            <xsd:attribute name="configServerUrl" type="xsd:string" use="required">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[ 统一配置中心后台url ]]></xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>
            <xsd:attribute name="isFetchFromUniconfd" type="xsd:boolean" use="optional" default="true">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[ 是否从统一配置中心后台拉取数据 ]]></xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>
            <xsd:attribute name="intervalTime" type="xsd:long" use="optional" default="15000">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[ 从统一配置中心获取数据的频率默认为15s ]]></xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>
            <xsd:attribute name="localDir" type="xsd:string" use="optional" default="config">
                <xsd:annotation>
                    <xsd:documentation><![CDATA[ 保存配置的本地目录默认为config ]]></xsd:documentation>
                </xsd:annotation>
            </xsd:attribute>


        </xsd:complexType>
    </xsd:element>
</xsd:schema>


2、spring.schemas文件:
http\://uni.xx.com/schema/uni/uni.xsd=META-INF/uni.xsd




3、spring.handlers文件
http\://uni.xx.com/schema/uni=com.xx.xx.uniconfig.client.NamespaceHandler.UniNamespaceHandler


4、
public class UniNamespaceHandler extends NamespaceHandlerSupport {
    public UniNamespaceHandler() {
    }


    public void init() {
        this.registerBeanDefinitionParser("client", new UniClientBeanDefinitionParser(UniConfigClientImpl.class));
    }
}
5、
public class UniClientBeanDefinitionParser implements BeanDefinitionParser {
    private final Class<?> beanClass;
    public UniClientBeanDefinitionParser(Class<?> beanClass) {
        this.beanClass = beanClass;
    }


    private BeanDefinition parse(Element element, ParserContext parserContext, Class<?> beanClass) {
        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClass(beanClass);
        beanDefinition.setLazyInit(false);
        String id = element.getAttribute("id");
        if (StringUtils.isNotBlank(id)){
            if(parserContext.getRegistry().containsBeanDefinition(id)) {
                throw new IllegalStateException("Duplicate spring bean id " + id);
            }
            parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);
        }




        buildGroupsPropertyArg(beanDefinition, element, parserContext);


        String debug = element.getAttribute("debug");
        beanDefinition.getPropertyValues().addPropertyValue("debug", Boolean.valueOf(debug));


        String uniConfigListener =  element.getAttribute("uniConfigListener");
        beanDefinition.getPropertyValues().addPropertyValue("uniConfigListener", new RuntimeBeanReference(uniConfigListener));


        String configServerUrl = element.getAttribute("configServerUrl");
        beanDefinition.getPropertyValues().addPropertyValue("configServerUrl", configServerUrl);


        String isFetchFromUniconfd = element.getAttribute("isFetchFromUniconfd");
        beanDefinition.getPropertyValues().addPropertyValue("isFetchFromUniconfd", Boolean.valueOf(isFetchFromUniconfd));


        String intervalTime = element.getAttribute("intervalTime");
        beanDefinition.getPropertyValues().addPropertyValue("intervalTime", Long.valueOf(intervalTime));


        String localDir = element.getAttribute("localDir");
        beanDefinition.getPropertyValues().addPropertyValue("localDir", localDir);


        return beanDefinition;
    }


    private void buildGroupsPropertyArg(RootBeanDefinition beanDefinition, Element element, ParserContext parserContext){
        Element groupElem = DomUtils.getChildElementByTagName(element, "groups");
        UniGroupsBeanDefinitionParser uniGroupsBeanDefinitionParser = new UniGroupsBeanDefinitionParser(ArrayListFactory.class);
        BeanDefinition beanDefinition1 = uniGroupsBeanDefinitionParser.parse(groupElem, parserContext);
        MutablePropertyValues mutablePropertyValues = beanDefinition1.getPropertyValues();
        PropertyValue propertyValue = mutablePropertyValues.getPropertyValue("valuesList");
        beanDefinition.getPropertyValues().addPropertyValue("groups", propertyValue.getValue());
    }


    public BeanDefinition parse(Element element, ParserContext parserContext) {
        return this.parse(element, parserContext, this.beanClass);
    }
}
6、
public class UniGroupsBeanDefinitionParser implements BeanDefinitionParser {
    private final Class<?> beanClass;
    public UniGroupsBeanDefinitionParser(Class<?> beanClass) {
        this.beanClass = beanClass;
    }


    private BeanDefinition parse(Element element, ParserContext parserContext, Class<?> beanClass) {
        RootBeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClass(beanClass);
        beanDefinition.setLazyInit(false);
        List<Element> nodeList = DomUtils.getChildElementsByTagName(element, "group");
        ArrayList<String> valuesList = new ArrayList<String>();
        for (Element element1 : nodeList){
            valuesList.add(element1.getTextContent());
        }
        MutablePropertyValues mutablePropertyValues = new MutablePropertyValues();
        mutablePropertyValues.add("valuesList", valuesList);
        beanDefinition.setPropertyValues(mutablePropertyValues);
        return beanDefinition;
    }


    public BeanDefinition parse(Element element, ParserContext parserContext) {
        return this.parse(element, parserContext, this.beanClass);
    }
}
7、
public class ArrayListFactory {
    private ArrayList<String> valuesList;


    public ArrayList<String> getValuesList() {
        return valuesList;
    }


    public void setValuesList(ArrayList<String> valuesList) {
        this.valuesList = valuesList;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值