博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微服务框架开发(二)—扩展spring schema
阅读量:5854 次
发布时间:2019-06-19

本文共 5670 字,大约阅读时间需要 18 分钟。

hot3.png

一、实体bean的定义 回顾一下我们需要定义的4个标签

  • 定义注册中心标签:
  • 定义服务协议标签
  • 定义服务提供标签:
或者
  • 定义服务引用标签:

UML图设计如下

  • RegistyConfig、ServiceConfig、RefererConfig分别继承自抽象类AbstractConfig,并分别定义了三个标签的相关属性。ServiceConfigBean、RefererConfigBean用于实现spring的相关接口,达到对配置文件中bean进行处理的目的。 输入图片说明

二、定义xsd文件(xmen.xsd)

三、定义handler处理文件(spring.schemas和spring.handlers)

http\://www.solid4j.com/schema/xmen.xsd=META-INF/xmen.xsdhttp\://www.solid4j.com/schema/xmen=com.solid4j.xmen.config.spring.handler.XmenNamespaceHandler

四、编写具体的Handler类

public class XmenNamespaceHandler extends NamespaceHandlerSupport {    @Override    public 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; } @Override public 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

你可能感兴趣的文章
就是一个表格
查看>>
CakePHP 2.x CookBook 中文版 第三章 入门 之 CakePHP 的结构
查看>>
Objective-C的算术表达式 .
查看>>
找回使用Eclipse删除的文件
查看>>
rabbitmq 消息系统 消息队列
查看>>
集成spring3、hibernate4、junit
查看>>
URL与ASCII
查看>>
Redis.conf 说明
查看>>
我的友情链接
查看>>
java读取properties配置文件
查看>>
LVS+keepalived负载均衡
查看>>
UITableview中cell重用引起的内容重复的问题
查看>>
stm32 ADC使用 单通道 多通道
查看>>
Windows7操作系统安装教程(图文)
查看>>
IOS Core Animation Advanced Techniques的学习笔记(三)
查看>>
除了模拟手术教学,VR在医疗领域如何应用?
查看>>
HashCode
查看>>
盘点5款Ubuntu监控工具解决CPU暴增问题
查看>>
java 测试IP
查看>>
C#实现ActiveX控件开发与部署
查看>>