我们先看下dubbo schema应用
以上的标签是怎么读的,读完之后怎么又是怎么解析,解析之后又干嘛,通过什么方式进行spi扩展的,我们在这里解决2方面问题,一说明下机制和原理的东西,二用一个Demo实现shema
其实,spring源码是这么玩的,当年我做分布式缓存框架也是这么玩的
我们以协议为例,其他的先隐藏
跑起
schema定义和解析
经过spring ioc处理后,就直接进入的spi extension最后一大环处理,其中包括上面测试schema所在的插件dubbo config的2个实例注入
最后以加载器getExtensionLoader结束
回到
退出程序
整个dubbo应用配置dubbo config组件(插件)标签到spring schema扩展(也叫dubbo schema扩展吧) 最后到扩展点扩展结束过程
所以建立spi扩展微内核进行应用级插件式扩展是软件工程设计思想的精髓,我们的OS,idea,eclipse,maven无不建立在这个思想上
如果有不清楚spi extension原理的可参考以下三篇文章
现在我们对spring schema也叫dubbo schema进行简单的剖析及demo说明
Peoper.class
people.xsd(名称可以随便,对应编写2个属性扩展模版)
注册spring
package com.parser;
import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
/**
* Created by luozhonghua on 2018/5/29.
*/
public class MyNamespaceHandler extends
NamespaceHandlerSupport {
@Override
public void init() {
//先注册bean工厂
registerBeanDefinitionParser("people", new PeopleBeanDefinitionParser());//people是一个element
}
}
解析
package com.parser;
import com.pojo.People;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
import org.springframework.util.StringUtils;
import org.w3c.dom.Element;
/**
* Created by luozhonghua on 2018/5/29.
*/
public class PeopleBeanDefinitionParser extends
AbstractSingleBeanDefinitionParser {
protected Class getBeanClass(Element element) {
return People.class;
}
/**
* 获取xsd属性
*
* @param element people.xsd
* @param bean people.class包装类
*/
protected void doParse(Element element, BeanDefinitionBuilder bean) {
String name = element.getAttribute("name");
String age = element.getAttribute("age");
if (StringUtils.hasText(name)) {
bean.addPropertyValue("name", name);
}
if (StringUtils.hasText(age)) {
bean.addPropertyValue("age",
Integer.valueOf(age));
}
}
}
编写以下2个扩展文件,命名固定,串起来
记住这2个文件路径!
这两个文件需要我们自己编写并放入 META-INF 文件夹中, 这两个文件的地址必须是 META-INF/spring.handlers 和 META-INF/spring.schemas,spring会默认去载入它们(实际上ioc)
最后编写
运行bean.xml
源码: https://github.com/luozhonghua/dubbo-spiDemo