浏览代码

添加spi加载自定义转换方法

hzd 5 年之前
父节点
当前提交
1f57bff2c0
共有 1 个文件被更改,包括 20 次插入0 次删除
  1. 20 0
      hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java

+ 20 - 0
hutool-core/src/main/java/cn/hutool/core/convert/ConverterRegistry.java

@@ -32,8 +32,10 @@ import cn.hutool.core.convert.impl.URLConverter;
 import cn.hutool.core.convert.impl.UUIDConverter;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.lang.TypeReference;
+import cn.hutool.core.util.ClassUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.core.util.ServiceLoaderUtil;
 import cn.hutool.core.util.TypeUtil;
 
 import java.io.Serializable;
@@ -59,9 +61,11 @@ import java.time.temporal.TemporalAccessor;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Currency;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Optional;
+import java.util.ServiceLoader;
 import java.util.TimeZone;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
@@ -107,6 +111,22 @@ public class ConverterRegistry implements Serializable{
 
 	public ConverterRegistry() {
 		defaultConverter();
+		putCustomBySpi();
+		
+		
+	}
+
+	@SuppressWarnings("rawtypes")
+	private void putCustomBySpi() {
+		List<Converter> list = ServiceLoaderUtil.loadList(Converter.class);
+		list.forEach(converter->{
+			try {
+				Type type = TypeUtil.getTypeArgument(ClassUtil.getClass(converter));
+				putCustom(type, converter);
+			} catch (Exception e) {
+				 // 忽略注册失败的
+			}
+		});
 	}
 
 	/**