Dubbo spi extension & Schema--Dubbo源码系列解读(4)

我们先看下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


猜你喜欢

转载自blog.csdn.net/luozhonghua2014/article/details/80501569
今日推荐