深圳市南山区做网站的小公司,公司做网站价格,网站模仿侵权,网站升级改版2019独角兽企业重金招聘Python工程师标准 一、实体bean的定义 回顾一下我们需要定义的4个标签 定义注册中心标签#xff1a;xmen:registry nameregistry regProtocolzookeeper address127.0.0.1:2181 connectTimeout 一、实体bean的定义 回顾一下我们需要定义的4个标签 定义注册中心标签xmen:registry nameregistry regProtocolzookeeper address127.0.0.1:2181 connectTimeout2000/定义服务协议标签xmen:protocol namexmen port20000 /定义服务提供标签xmen:service interfacexxx.xxx.xxx.service classxxx port8000/或者
xmen:service interfacexxx.xxx.xxx.service refxxx port8000/定义服务引用标签xmen:referer idxxxService interfacexxx.xxx.xxx.service/UML图设计如下 RegistyConfig、ServiceConfig、RefererConfig分别继承自抽象类AbstractConfig并分别定义了三个标签的相关属性。ServiceConfigBean、RefererConfigBean用于实现spring的相关接口达到对配置文件中bean进行处理的目的。 二、定义xsd文件xmen.xsd ?xml version1.0 encodingUTF-8?
xsd:schema xmlnshttp://www.solid4j.com/schema/xmen xmlns:xsdhttp://www.w3.org/2001/XMLSchemaxmlns:toolhttp://www.springframework.org/schema/tool xmlns:beanshttp://www.springframework.org/schema/beanstargetNamespacehttp://www.solid4j.com/schema/xmenxsd:import namespacehttp://www.w3.org/XML/1998/namespace /xsd:import namespacehttp://www.springframework.org/schema/tool /xsd:import namespacehttp://www.springframework.org/schema/beans /xsd:complexType nameabstractConfigxsd:anyAttribute //xsd:complexTypexsd:complexType nameabstractRegistryConfigxsd:complexContentxsd:extension baseabstractConfigxsd:attribute nameid typexsd:ID /xsd:attribute namename typexsd:string useoptionalxsd:annotationxsd:documentation![CDATA[ 注册名称. ]]/xsd:documentation/xsd:annotation/xsd:attributexsd:attribute nameregProtocol typexsd:stringuseoptionalxsd:annotationxsd:documentation![CDATA[ 注册协议. ]]/xsd:documentation/xsd:annotation/xsd:attributexsd:attribute nameaddress typexsd:string useoptionalxsd:annotationxsd:documentation![CDATA[ 注册中心地址. ]]/xsd:documentation/xsd:annotation/xsd:attributexsd:attribute nameconnectTimeout typexsd:integeruseoptionalxsd:annotationxsd:documentation![CDATA[ 注册中心连接超时时间(毫秒). ]]/xsd:documentation/xsd:annotation/xsd:attribute/xsd:extension/xsd:complexContent/xsd:complexTypexsd:complexType nameabstractProtocolConfigxsd:complexContentxsd:extension baseabstractConfigxsd:attribute nameid typexsd:ID /xsd:attribute namename typexsd:string useoptionalxsd:annotationxsd:documentation![CDATA[ 协议名称. ]]/xsd:documentation/xsd:annotation/xsd:attributexsd:attribute nameport typexsd:integer useoptionalxsd:annotationxsd:documentation![CDATA[ 服务端口 ]]/xsd:documentation/xsd:annotation/xsd:attribute/xsd:extension/xsd:complexContent/xsd:complexTypexsd:complexType nameabstractServiceConfigxsd:complexContentxsd:extension baseabstractConfigxsd:attribute nameid typexsd:ID /xsd:attribute nameinterface typexsd:tokenxsd:annotationxsd:documentation![CDATA[ 定义接口在注册中心中注册 ]]/xsd:documentationxsd:appinfotool:annotationtool:expected-type typejava.lang.Class //tool:annotation/xsd:appinfo/xsd:annotation/xsd:attributexsd:attribute nameref typexsd:string useoptionalxsd:annotationxsd:documentation![CDATA[ 接口实现 ]]/xsd:documentation/xsd:annotation/xsd:attributexsd:attribute nameclass typexsd:string useoptionalxsd:annotationxsd:documentation![CDATA[ 接口实现 ]]/xsd:documentation/xsd:annotation/xsd:attribute/xsd:extension/xsd:complexContent/xsd:complexTypexsd:complexType nameabstractRefererConfigxsd:complexContentxsd:extension baseabstractConfigxsd:attribute nameid typexsd:ID /xsd:attribute nameinterface typexsd:token userequiredxsd:annotationxsd:documentation![CDATA[ 调用的接口 ]]/xsd:documentationxsd:appinfotool:annotationtool:expected-type typejava.lang.Class //tool:annotation/xsd:appinfo/xsd:annotation/xsd:attribute/xsd:extension/xsd:complexContent/xsd:complexTypexsd:element nameregistry typeabstractRegistryConfigxsd:annotationxsd:documentation![CDATA[ 注册中心配置 ]]/xsd:documentation/xsd:annotation/xsd:elementxsd:element nameprotocol typeabstractProtocolConfigxsd:annotationxsd:documentation![CDATA[ 服务协议 ]]/xsd:documentation/xsd:annotation/xsd:elementxsd:element nameservice typeabstractServiceConfigxsd:annotationxsd:documentation![CDATA[ 服务配置 ]]/xsd:documentation/xsd:annotation/xsd:elementxsd:element namereferer typeabstractRefererConfigxsd:annotationxsd:documentation![CDATA[ 引用服务配置 ]]/xsd:documentation/xsd:annotation/xsd:element
/xsd:schema三、定义handler处理文件spring.schemas和spring.handlers http\://www.solid4j.com/schema/xmen.xsdMETA-INF/xmen.xsdhttp\://www.solid4j.com/schema/xmencom.solid4j.xmen.config.spring.handler.XmenNamespaceHandler四、编写具体的Handler类 public class XmenNamespaceHandler extends NamespaceHandlerSupport {Overridepublic void init() {registerBeanDefinitionParser(registry, new XmenBeanDefinitionParser(RegistryConfig.class, true));registerBeanDefinitionParser(protocol, new XmenBeanDefinitionParser(ProtocolConfig.class, true));registerBeanDefinitionParser(service, new XmenBeanDefinitionParser(ServiceConfigBean.class, true));registerBeanDefinitionParser(referer, new XmenBeanDefinitionParser(RefererConfigBean.class, false));}
}public class XmenBeanDefinitionParser implements BeanDefinitionParser {private static final Logger LOGGER LoggerFactory.getLogger(BeanDefinitionParser.class);private final Class? beanClass;private final boolean required;public XmenBeanDefinitionParser(Class? beanClass, boolean required) {this.beanClass beanClass;this.required required;}Overridepublic BeanDefinition parse(Element element, ParserContext parseContext) {try {return parse(element, parseContext, beanClass, required);} catch (ClassNotFoundException e) {e.printStackTrace();}return null;}private BeanDefinition parse(Element element, ParserContext parserContext, Class? beanClass, boolean required) throws ClassNotFoundException {RootBeanDefinition bd new RootBeanDefinition();bd.setBeanClass(beanClass);bd.setLazyInit(false);String id element.getAttribute(id);if ((id null || id.length() 0) required) {String generatedBeanName element.getAttribute(name);if (generatedBeanName null || generatedBeanName.length() 0) {generatedBeanName element.getAttribute(class);}if (generatedBeanName null || generatedBeanName.length() 0) {generatedBeanName beanClass.getName();}id generatedBeanName;int counter 2;while (parserContext.getRegistry().containsBeanDefinition(id)) {id generatedBeanName (counter);}}if (id ! null) {if (parserContext.getRegistry().containsBeanDefinition(id)) {throw new IllegalStateException(Duplicate spring bean config, id id);}parserContext.getRegistry().registerBeanDefinition(id, bd);}bd.getPropertyValues().addPropertyValue(id, id);if(ServiceConfigBean.class.equals(beanClass)) {String className element.getAttribute(class);if(className ! null className.length() 0) {RootBeanDefinition classDefinition new RootBeanDefinition();classDefinition.setBeanClass(Class.forName(className, true, Thread.currentThread().getContextClassLoader()));classDefinition.setLazyInit(false);bd.getPropertyValues().addPropertyValue(ref, new BeanDefinitionHolder(classDefinition, id Impl));}}for (Method setter : beanClass.getMethods()) {String name setter.getName();if (name.length() 3 || !name.startsWith(set) || !Modifier.isPublic(setter.getModifiers())) {continue;}String property name.substring(3, 4).toLowerCase() name.substring(4);if (id.equals(property)) {bd.getPropertyValues().addPropertyValue(id, id);continue;}String value element.getAttribute(property);value value.trim();if (value.length() 0 || value null) {continue;}Object reference;if (ref.equals(property)) {reference new RuntimeBeanReference(value);} else {reference new TypedStringValue(value);}bd.getPropertyValues().addPropertyValue(property, reference);}return bd;}
}转载于:https://my.oschina.net/solidwang/blog/800964