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

This commit is contained in:
YunaiV
2026-03-08 09:49:39 +08:00
parent c88f33c919
commit 67426d72f4
2 changed files with 42 additions and 41 deletions

View File

@@ -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() { static {
long now = System.currentTimeMillis(); init();
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);
}
// 构建父子关系:因为 Area 中没有 parentId 字段,所以需要重复读取 /**
for (CsvRow row : rows) { * 初始化
Area area = areas.get(Integer.valueOf(row.get(0))); // 自己 */
Area parent = areas.get(Integer.valueOf(row.get(3))); // 父 private static void init() {
Assert.isTrue(area != parent, "{}:父子节点相同", area.getName()); try {
area.setParent(parent); long now = System.currentTimeMillis();
parent.getChildren().add(area); 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);
} }
/** /**

View File

@@ -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) { } catch (Exception e) {
log.error("启动加载 IPUtils 失败", e); throw new RuntimeException("IPUtils 初始化失败", e);
} }
} }