diff --git a/CHANGELOG.md b/CHANGELOG.md index 23ce0686d..a73c65485 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * 【core 】 增加ValueListHandler,优化结果集获取方式 * 【http 】 支持patch方法(issue#666@Github) * 【crypto】 BCUtil支持更加灵活的密钥类型,增加writePemObject方法 +* 【core 】 增加ServiceLoaderUtil ### Bug修复 diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ServiceLoaderUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ServiceLoaderUtil.java new file mode 100644 index 000000000..fdc57da56 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/util/ServiceLoaderUtil.java @@ -0,0 +1,58 @@ +package cn.hutool.core.util; + +import java.util.Iterator; +import java.util.ServiceLoader; + +/** + * SPI机制中的服务加载工具类,流程如下 + * + *
+ *     1、创建接口,并创建实现类
+ *     2、ClassPath/META-INF/services下创建与接口全限定类名相同的文件
+ *     3、文件内容填写实现类的全限定类名
+ * 
+ * 相关介绍见:https://www.jianshu.com/p/3a3edbcd8f24 + * + * @author looly + * @since 5.1.6 + */ +public class ServiceLoaderUtil { + + /** + * 加载第一个服务,如果用户定义了多个接口实现类,只获取第一个。 + * + * @param 接口类型 + * @param clazz 服务接口 + * @return 第一个服务接口实现对象,无实现返回{@code null} + */ + public static T loadFirst(Class clazz) { + final Iterator iterator = load(clazz).iterator(); + if(iterator.hasNext()){ + return iterator.next(); + } + return null; + } + + /** + * 加载服务 + * + * @param 接口类型 + * @param clazz 服务接口 + * @return 服务接口实现列表 + */ + public static ServiceLoader load(Class clazz) { + return ServiceLoader.load(clazz); + } + + /** + * 加载服务 + * + * @param 接口类型 + * @param clazz 服务接口 + * @param loader {@link ClassLoader} + * @return 服务接口实现列表 + */ + public static ServiceLoader load(Class clazz, ClassLoader loader) { + return ServiceLoader.load(clazz, loader); + } +}