ソースを参照

add ServiceLoader

Looly 5 年 前
コミット
b740fe6480

+ 1 - 0
CHANGELOG.md

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

+ 58 - 0
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机制中的服务加载工具类,流程如下
+ *
+ * <pre>
+ *     1、创建接口,并创建实现类
+ *     2、ClassPath/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);
+	}
+}