上篇文章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());
}
网友评论