mirror of
https://gitee.com/dromara/hutool.git
synced 2025-04-05 17:37:59 +08:00
add ServiceLoader
This commit is contained in:
parent
d5506b7d9e
commit
b740fe6480
@ -12,6 +12,7 @@
|
||||
* 【core 】 增加ValueListHandler,优化结果集获取方式
|
||||
* 【http 】 支持patch方法(issue#666@Github)
|
||||
* 【crypto】 BCUtil支持更加灵活的密钥类型,增加writePemObject方法
|
||||
* 【core 】 增加ServiceLoaderUtil
|
||||
|
||||
### Bug修复
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user