美文网首页
SPI 外部接口实现类

SPI 外部接口实现类

作者: 极简博客 | 来源:发表于2022-08-06 12:17 被阅读0次

    上篇文章AJ-Captcha用户行为验证码中提到SPI,查看了相应的源码实现,觉得挺新奇的;就单独拎出来讲解一下,加深印象。

    1、什么是SPI?

      SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。
    SPI的作用就是为这些被扩展的API寻找服务实现。

      我的理解:在引用第三方jar时,提供自己外部实现接口类。

    2、使用场景

      内部jar接口外部实现拓展场景

    3、简单实现

    • META-INF.services下创建接口完整名称文件

    • 内部内容为实现类路径

    com.anji.captcha.demo.service.CaptchaCacheServiceRedisImpl
    
    • jar包内部实现({@link com.anji.captcha.service.impl.CaptchaServiceFactory}),通过ServiceLoader.load(CaptchaCacheService.class)将接口实现类保存在Map<Type, CaptchaService>集合中
    public static CaptchaCacheService getCache(String cacheType) {
        return cacheService.get(cacheType);
    }
    
    public volatile static Map<String, CaptchaService> instances = new HashMap();
    public volatile static Map<String, CaptchaCacheService> cacheService = new HashMap();
    
    static {
        ServiceLoader<CaptchaCacheService> cacheServices = ServiceLoader.load(CaptchaCacheService.class);
        for (CaptchaCacheService item : cacheServices) {
            cacheService.put(item.type(), item);
        }
        logger.info("supported-captchaCache-service:{}", cacheService.keySet().toString());
        ServiceLoader<CaptchaService> services = ServiceLoader.load(CaptchaService.class);
        for (CaptchaService item : services) {
            instances.put(item.captchaType(), item);
        }
        ;
        logger.info("supported-captchaTypes-service:{}", instances.keySet().toString());
    }
    

    4、原理解析

    ServiceLoader

    相关文章

      网友评论

          本文标题:SPI 外部接口实现类

          本文链接:https://www.haomeiwen.com/subject/goamwrtx.html