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

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

内容简介:一些优秀的开源框架,总会给开发者留一个后门,方便实现对其中某一块功能,根据公司自身生态进行有效的扩展,比如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() 进行实例化,这就要求实现类需要有无参构造函数,

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


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

查看所有标签

猜你喜欢:

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

The Filter Bubble

The Filter Bubble

Eli Pariser / Penguin Press / 2011-5-12 / GBP 16.45

In December 2009, Google began customizing its search results for each user. Instead of giving you the most broadly popular result, Google now tries to predict what you are most likely to click on. Ac......一起来看看 《The Filter Bubble》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具