第一步:编写xsd文件
首先要定义xml的约束文件,本文使用xsd约束而不是dtd,<?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>
特别注意:第二步:编写spring.schemas文件
红框中的内容是自定义的内容。但是这两个值是一一对应的,spring读取xml文件内容的时候会校验这个xsd文件,默认去META-INF路径去找spring.schemas文件,spring.schemas文件中内容如下,
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
第四步:编写自定义标签解析类的初始化类
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));
}
}
第五步:自定义标签解析类(以xsd文件中registry标签解析为例)
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;
}
}
第六步:测试
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>
特别注意: