Просмотр исходного кода

refactor(ip): 使用 static 块优化 IPUtils 和 AreaUtils 初始化逻辑

YunaiV месяцев назад: 6
Родитель
Сommit
67426d72f4

+ 32 - 29
yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/utils/AreaUtils.java

@@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import cn.iocoder.yudao.framework.ip.core.Area;
 import cn.iocoder.yudao.framework.ip.core.Area;
 import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum;
 import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum;
 import lombok.NonNull;
 import lombok.NonNull;
+import lombok.experimental.UtilityClass;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
@@ -25,44 +26,46 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
  * @author 芋道源码
  * @author 芋道源码
  */
  */
 @Slf4j
 @Slf4j
+@UtilityClass
 public class AreaUtils {
 public class AreaUtils {
 
 
-    /**
-     * 初始化 SEARCHER
-     */
-    @SuppressWarnings("InstantiationOfUtilityClass")
-    private final static AreaUtils INSTANCE = new AreaUtils();
-
     /**
     /**
      * Area 内存缓存,提升访问速度
      * Area 内存缓存,提升访问速度
      */
      */
     private static Map<Integer, Area> areas;
     private static Map<Integer, Area> areas;
 
 
-    private AreaUtils() {
-        long now = System.currentTimeMillis();
-        areas = new HashMap<>();
-        areas.put(Area.ID_GLOBAL, new Area(Area.ID_GLOBAL, "全球", 0,
-                null, new ArrayList<>()));
-        // 从 csv 中加载数据
-        List<CsvRow> rows = CsvUtil.getReader().read(ResourceUtil.getUtf8Reader("area.csv")).getRows();
-        rows.remove(0); // 删除 header
-        for (CsvRow row : rows) {
-            // 创建 Area 对象
-            Area area = new Area(Integer.valueOf(row.get(0)), row.get(1), Integer.valueOf(row.get(2)),
-                    null, new ArrayList<>());
-            // 添加到 areas 中
-            areas.put(area.getId(), area);
-        }
+    static {
+        init();
+    }
 
 
-        // 构建父子关系:因为 Area 中没有 parentId 字段,所以需要重复读取
-        for (CsvRow row : rows) {
-            Area area = areas.get(Integer.valueOf(row.get(0))); // 自己
-            Area parent = areas.get(Integer.valueOf(row.get(3))); // 父
-            Assert.isTrue(area != parent, "{}:父子节点相同", area.getName());
-            area.setParent(parent);
-            parent.getChildren().add(area);
+    /**
+     * 初始化
+     */
+    private static void init() {
+        try {
+            long now = System.currentTimeMillis();
+            areas = new HashMap<>();
+            areas.put(Area.ID_GLOBAL, new Area(Area.ID_GLOBAL, "全球", 0, null, new ArrayList<>()));
+            // 从 csv 中加载数据
+            List<CsvRow> rows = CsvUtil.getReader().read(ResourceUtil.getUtf8Reader("area.csv")).getRows();
+            rows.remove(0); // 删除 header
+            for (CsvRow row : rows) {
+                Area area = new Area(Integer.valueOf(row.get(0)), row.get(1), Integer.valueOf(row.get(2)), null, new ArrayList<>());
+                areas.put(area.getId(), area);
+            }
+
+            // 构建父子关系:因为 Area 中没有 parentId 字段,所以需要重复读取
+            for (CsvRow row : rows) {
+                Area area = areas.get(Integer.valueOf(row.get(0))); // 自己
+                Area parent = areas.get(Integer.valueOf(row.get(3))); // 父
+                Assert.isTrue(area != parent, "{}:父子节点相同", area.getName());
+                area.setParent(parent);
+                parent.getChildren().add(area);
+            }
+            log.info("启动加载 AreaUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now);
+        } catch (Exception e) {
+            throw new RuntimeException("AreaUtils 初始化失败", e);
         }
         }
-        log.info("启动加载 AreaUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now);
     }
     }
 
 
     /**
     /**

+ 10 - 12
yudao-framework/yudao-spring-boot-starter-biz-ip/src/main/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtils.java

@@ -3,11 +3,10 @@ package cn.iocoder.yudao.framework.ip.core.utils;
 import cn.hutool.core.io.resource.ResourceUtil;
 import cn.hutool.core.io.resource.ResourceUtil;
 import cn.iocoder.yudao.framework.ip.core.Area;
 import cn.iocoder.yudao.framework.ip.core.Area;
 import lombok.SneakyThrows;
 import lombok.SneakyThrows;
+import lombok.experimental.UtilityClass;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.lionsoul.ip2region.xdb.Searcher;
 import org.lionsoul.ip2region.xdb.Searcher;
 
 
-import java.io.IOException;
-
 /**
 /**
  * IP 工具类
  * IP 工具类
  *
  *
@@ -16,30 +15,29 @@ import java.io.IOException;
  * @author wanglhup
  * @author wanglhup
  */
  */
 @Slf4j
 @Slf4j
+@UtilityClass
 public class IPUtils {
 public class IPUtils {
 
 
-    /**
-     * 初始化 SEARCHER
-     */
-    @SuppressWarnings("InstantiationOfUtilityClass")
-    private final static IPUtils INSTANCE = new IPUtils();
-
     /**
     /**
      * IP 查询器,启动加载到内存中
      * IP 查询器,启动加载到内存中
      */
      */
     private static Searcher SEARCHER;
     private static Searcher SEARCHER;
 
 
+    static {
+        init();
+    }
+
     /**
     /**
-     * 私有化构造
+     * 初始化
      */
      */
-    private IPUtils() {
+    private static void init() {
         try {
         try {
             long now = System.currentTimeMillis();
             long now = System.currentTimeMillis();
             byte[] bytes = ResourceUtil.readBytes("ip2region.xdb");
             byte[] bytes = ResourceUtil.readBytes("ip2region.xdb");
             SEARCHER = Searcher.newWithBuffer(bytes);
             SEARCHER = Searcher.newWithBuffer(bytes);
             log.info("启动加载 IPUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now);
             log.info("启动加载 IPUtils 成功,耗时 ({}) 毫秒", System.currentTimeMillis() - now);
-        } catch (IOException e) {
-            log.error("启动加载 IPUtils 失败", e);
+        } catch (Exception e) {
+            throw new RuntimeException("IPUtils 初始化失败", e);
         }
         }
     }
     }