add ServiceLoader

This commit is contained in:
Looly 2020-03-01 19:02:06 +08:00
parent d5506b7d9e
commit b740fe6480
2 changed files with 59 additions and 0 deletions

View File

@ -12,6 +12,7 @@
* 【core 】 增加ValueListHandler优化结果集获取方式
* 【http 】 支持patch方法issue#666@Github
* 【crypto】 BCUtil支持更加灵活的密钥类型增加writePemObject方法
* 【core 】 增加ServiceLoaderUtil
### Bug修复

View File

@ -0,0 +1,58 @@
package cn.hutool.core.util;
import java.util.Iterator;
import java.util.ServiceLoader;
/**
* SPI机制中的服务加载工具类流程如下
*
* <pre>
* 1创建接口并创建实现类
* 2ClassPath/META-INF/services下创建与接口全限定类名相同的文件
* 3文件内容填写实现类的全限定类名
* </pre>
* 相关介绍见https://www.jianshu.com/p/3a3edbcd8f24
*
* @author looly
* @since 5.1.6
*/
public class ServiceLoaderUtil {
/**
* 加载第一个服务如果用户定义了多个接口实现类只获取第一个
*
* @param <T> 接口类型
* @param clazz 服务接口
* @return 第一个服务接口实现对象无实现返回{@code null}
*/
public static <T> T loadFirst(Class<T> clazz) {
final Iterator<T> iterator = load(clazz).iterator();
if(iterator.hasNext()){
return iterator.next();
}
return null;
}
/**
* 加载服务
*
* @param <T> 接口类型
* @param clazz 服务接口
* @return 服务接口实现列表
*/
public static <T> ServiceLoader<T> load(Class<T> clazz) {
return ServiceLoader.load(clazz);
}
/**
* 加载服务
*
* @param <T> 接口类型
* @param clazz 服务接口
* @param loader {@link ClassLoader}
* @return 服务接口实现列表
*/
public static <T> ServiceLoader<T> load(Class<T> clazz, ClassLoader loader) {
return ServiceLoader.load(clazz, loader);
}
}