在spring配置文件中扩展自己的xml bean配置,参考spring帮助文档的 Extensible XML authoring 部分,这里不详细说明了。
ldubbo框架服务端、客户端也基于spring配置文件
服务端bean的定义,只定义一个protocol bean和一个service bean,如下:
<ldubbo:protocol name="ldubbo"/>
<ldubbo:service interface="com.lipenglong.ldubbo.api.service.UserService" ref="userService"/>
首先要有一个协议配置,ldubbo框架我们写两个简单的实现,rmi协议和ldubbo协议。srvice暴露服务配置,要有一个interface说明暴露的是哪个接口服务,ref指向接口的实现。
客户端bean的定义,定义一个registry bean和一个reference bean,如下:
<ldubbo:registry address="127.0.0.1:30880" protocol="ldubbo"/>
<ldubbo:reference interface="com.lipenglong.ldubbo.api.service.UserService" id="userService"/>
这里客户端定义一个registry,指定服务端ip端口和使用的协议,dubbo一般使用的注册中心是zookeeper,自己实现的这个rpc demo框架简单些直接连接服务端。
约定好了服务端,客户端的配置,接下来该定义这些命名空间了。在resources目录下创建META-INF目录,创建一个ldubbo.xsd文件,定义自己的schema文件,如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.lipenglong.com/schema/ldubbo"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:beans="http://www.springframework.org/schema/beans"
targetNamespace="http://www.lipenglong.com/schema/ldubbo"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<xsd:import namespace="http://www.springframework.org/schema/beans"/>
<xsd:element name="protocol">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="name" type="protocol-types" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:simpleType name="protocol-types">
<xsd:restriction base="xsd:NMTOKEN">
<xsd:enumeration value="rmi"/>
<xsd:enumeration value="ldubbo"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:element name="service">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="interface" type="xsd:string" use="required"/>
<xsd:attribute name="ref" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="registry">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="address" type="xsd:string" use="required"/>
<xsd:attribute name="protocol" type="protocol-types" use="optional"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
<xsd:element name="reference">
<xsd:complexType>
<xsd:complexContent>
<xsd:extension base="beans:identifiedType">
<xsd:attribute name="interface" type="xsd:string" use="required"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:element>
</xsd:schema>
protocol元素定义一个name属性,name属性的type是自定义的protocol-types,有rmi和ldubbo两个枚举值;
service元素的interface和ref属性都是string类型;
registry元素的address是string类型,protocol使用上面定义的protocol-types枚举类型;
reference元素定义一个string类型interface属性,这里并没有定义id,因为spring的bean默认都有id这个属性。
根据spring xml扩展的语法规则,在META-INF目录下,定义spring.handlers和spring.schemas两个文件
spring.schemas文件:
http\://www.lipenglong.com/schema/ldubbo/ldubbo.xsd=META-INF/ldubbo.xsd
spring.handers文件:
http\://www.lipenglong.com/schema/ldubbo=com.lipenglong.ldubbo.config.spring.schema.LdubboNamespaceHandler
LdubboNamespaceHandler类是解析自定义命名空间的类,下一篇详细介绍NamespaceHandler和BeanDefinitionParser的实现,如何实现自定义bean的解析并初始化到spring的容器。