第一步:編寫xsd文件
首先要定義xml的約束文件办斑,本文使用xsd約束而不是dtd谨垃,META-INF
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns="http://code.ruochentech.com/schema/dubbo"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://code.ruochentech.com/schema/dubbo">
<xsd:element name="registry">
<xsd:complexType>
<xsd:attribute name="protocol" type="xsd:string"></xsd:attribute>
<xsd:attribute name="address" type="xsd:string"></xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="reference">
<xsd:complexType>
<xsd:attribute name="id" type="xsd:string"></xsd:attribute>
<xsd:attribute name="interface" type="xsd:string"></xsd:attribute>
<xsd:attribute name="loadbalance" type="xsd:string"></xsd:attribute>
<xsd:attribute name="protocol" type="xsd:string"></xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="protocol">
<xsd:complexType>
<xsd:attribute name="name" type="xsd:string"></xsd:attribute>
<xsd:attribute name="port" type="xsd:string"></xsd:attribute>
<xsd:attribute name="host" type="xsd:string"></xsd:attribute>
</xsd:complexType>
</xsd:element>
<xsd:element name="service">
<xsd:complexType>
<xsd:attribute name="interface" type="xsd:string"></xsd:attribute>
<xsd:attribute name="ref" type="xsd:string"></xsd:attribute>
<xsd:attribute name="protocol" type="xsd:string"></xsd:attribute>
</xsd:complexType>
</xsd:element>
</xsd:schema>
特別注意:自定義的xsd文件頭
第二步:編寫spring.schemas文件
紅框中的內(nèi)容是自定義的內(nèi)容距芬。但是這兩個(gè)值是一一對(duì)應(yīng)的解滓,spring讀取xml文件內(nèi)容的時(shí)候會(huì)校驗(yàn)這個(gè)xsd文件踊谋,默認(rèn)去META-INF路徑去找spring.schemas文件,spring.schemas文件中內(nèi)容如下后裸,
http\://code.ruochentech.com/schema/dubbo/soa.xsd=META-INF/soa.xsd
第三步:配置spring.handlers文件
http\://code.ruochentech.com/schema/dubbo=com.yonyou.soa.parser.SOANamespaceHandler
第四步:編寫自定義標(biāo)簽解析類的初始化類
public class SOANamespaceHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("registry",new RegistryBeanDefinitionParser(Registry.class));
registerBeanDefinitionParser("reference",new ReferenceBeanDefinitionParser(Reference.class));
registerBeanDefinitionParser("protocol",new ProtocolBeanDefinitionParser(Protocol.class));
registerBeanDefinitionParser("service",new ServiceBeanDefinitionParser(Registry.class));
}
}
第五步:自定義標(biāo)簽解析類(以xsd文件中registry標(biāo)簽解析為例)
public class RegistryBeanDefinitionParser implements BeanDefinitionParser {
private Class<?> beanClass;
public RegistryBeanDefinitionParser(Class<?> beanClass){
this.beanClass=beanClass;
}
public BeanDefinition parse(Element element, ParserContext parserContext) {
RootBeanDefinition rootBeanDefinition=new RootBeanDefinition();
rootBeanDefinition.setBeanClass(beanClass);
rootBeanDefinition.setLazyInit(false);
String protocol = element.getAttribute("protocol");
String address = element.getAttribute("address");
rootBeanDefinition.getPropertyValues().addPropertyValue("protocol",protocol);
rootBeanDefinition.getPropertyValues().addPropertyValue("address",address);
return rootBeanDefinition;
}
}
第六步:測(cè)試
6.1配置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:ruochen="http://code.ruochentech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://code.ruochentech.com/schema/dubbo http://code.ruochentech.com/schema/dubbo/soa.xsd"
default-lazy-init="true">
<bean id="testServiceImpl" class="com.yonyou.soa.test.TestServiceImpl"></bean>
<ruochen:registry address="127.0.0.1:6379" protocol="redis"></ruochen:registry>
<ruochen:reference id="testService" protocol="http" interface="com.yonyou.soa.test.TestService" loadbalance="random"></ruochen:reference>
<ruochen:protocol name="http" host="127.0.0.1" port="27017"></ruochen:protocol>
</beans>
特別注意:測(cè)試xml文件注意點(diǎn)