原先的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;
}
}
<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;
}
}