优秀开源框架的扩展机制实现

栏目: 后端 · 发布时间: 7年前

内容简介:一些优秀的开源框架,总会给开发者留一个后门,方便实现对其中某一块功能,根据公司自身生态进行有效的扩展,比如Neflix开源的Hystrix,其实Hystrix的代码写的真的很好,除了RxJava那部分晦涩的实现。在Hystrix中的插件实现中,提供了5个扩展点,通过实现这些插件接口,可以很好的结合公司内部框架进行使用,比如数据埋点、动态配置等等,下面以事件通知接口为例子,看看Hystrix是如何实现的。通过

一些优秀的开源框架,总会给开发者留一个后门,方便实现对其中某一块功能,根据公司自身生态进行有效的扩展,比如Neflix开源的Hystrix,其实Hystrix的代码写的真的很好,除了RxJava那部分晦涩的实现。

在Hystrix中的插件实现中,提供了5个扩展点,通过实现这些插件接口,可以很好的结合公司内部框架进行使用,比如数据埋点、动态配置等等,下面以事件通知接口为例子,看看Hystrix是如何实现的。

public HystrixEventNotifier getEventNotifier() {
    if (notifier.get() == null) {
        // check for an implementation from Archaius first
        Object impl = getPluginImplementation(HystrixEventNotifier.class);
        if (impl == null) {
            // nothing set via Archaius so initialize with default
            notifier.compareAndSet(null, HystrixEventNotifierDefault.getInstance());
            // we don't return from here but call get() again in case of thread-race so the winner will always get returned
        } else {
            // we received an implementation from Archaius so use it
            notifier.compareAndSet(null, (HystrixEventNotifier) impl);
        }
    }
    return notifier.get();
}

通过 getEventNotifier 方法获取事件通知器,当然了,一开始是没有初始化的,先尝试使用 getPluginImplementation 方法,看看能不能拿到,拿不到就使用本地默认的实现。

private <T> T getPluginImplementation(Class<T> pluginClass) {
    T p = getPluginImplementationViaProperties(pluginClass, dynamicProperties);
    if (p != null) return p;        
    return findService(pluginClass, classLoader);
}

这里,Hystrix还提供了另外一种实现,很简单,就不解释了,这里的重点是 findService 实现。

private static <T> T findService(Class<T> spi,  ClassLoader classLoader) throws ServiceConfigurationError {
    ServiceLoader<T> sl = ServiceLoader.load(spi, classLoader);
    for (T s : sl) {
        if (s != null)
            return s;
    }
    return null;
}

其实,这里的实现是使用 Java 内置的SPI机制,SPI是什么?

SPI 全称为 Service Provider Interface),是一种服务提供发现机制,通过 ServiceLoader 类的load方法,可以自动找到实现对应接口的实现类,为了更清晰的了解其中原理,可以去看看load方法的源码实现。

一个大概的过程是:load方法会尝试在classpath下META-INF/services/文件夹下查找一个文件,其中文件名是接口的全限定名。

优秀开源框架的扩展机制实现

如上图所述, CacheKeyFilter 是一个接口,在这个文件中,需要指定接口实现类的全限定名。

优秀开源框架的扩展机制实现

当然了,你也可以换行指定多个,找到这些实现类之后,会通过反射机制,即 class.newInstance() 进行实例化,这就要求实现类需要有无参构造函数,

通过这种方式,我们就可以愉快的对开源框架所提供的接口进行扩展,加入各种骚操作,还不动手试试?


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

代码整洁之道

代码整洁之道

马丁 / 人民邮电出版社 / 2011-1 / 59.00元

《代码整洁之道(英文版)》提出一种观念:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。作为编程领域的佼佼者,《代码整洁之道(英文版)》作者给出了一系列行之有效的整洁代码操作实践。这些实践在《代码整洁之道(英文版)》中体现为一条条规则(或称“启示”),并辅以来自现实项目的正、反两面的范例。只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量。 ......一起来看看 《代码整洁之道》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具