refactor(extension/crud): 调整 BaseService 相关泛型类型加载为懒加载

This commit is contained in:
2024-07-16 22:57:35 +08:00
parent a110bd9789
commit dca715709f
2 changed files with 74 additions and 42 deletions

View File

@@ -36,13 +36,25 @@ import java.util.List;
*/ */
public class ServiceImpl<M extends BaseMapper<T>, T> extends com.baomidou.mybatisplus.extension.service.impl.ServiceImpl<M, T> implements IService<T> { public class ServiceImpl<M extends BaseMapper<T>, T> extends com.baomidou.mybatisplus.extension.service.impl.ServiceImpl<M, T> implements IService<T> {
protected final List<Field> entityFields = ReflectUtils.getNonStaticFields(this.getEntityClass()); private List<Field> entityFields;
@Override @Override
public T getById(Serializable id) { public T getById(Serializable id) {
return this.getById(id, true); return this.getById(id, true);
} }
/**
* 获取当前实体类型字段
*
* @return 当前实体类型字段列表
*/
public List<Field> getEntityFields() {
if (this.entityFields == null) {
this.entityFields = ReflectUtils.getNonStaticFields(this.getEntityClass());
}
return this.entityFields;
}
/** /**
* 根据 ID 查询 * 根据 ID 查询
* *

View File

@@ -68,17 +68,16 @@ import java.util.*;
*/ */
public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdDO, L, D, Q, C> extends ServiceImpl<M, T> implements BaseService<L, D, Q, C> { public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdDO, L, D, Q, C> extends ServiceImpl<M, T> implements BaseService<L, D, Q, C> {
private final Class<?>[] typeArgumentCache = ClassUtils.getTypeArguments(this.getClass()); private Class<L> listClass;
protected final Class<L> listClass = this.currentListClass(); private Class<D> detailClass;
protected final Class<D> detailClass = this.currentDetailClass(); private Class<Q> queryClass;
protected final Class<Q> queryClass = this.currentQueryClass(); private List<Field> queryFields;
private final List<Field> queryFields = ReflectUtils.getNonStaticFields(this.queryClass);
@Override @Override
public PageResp<L> page(Q query, PageQuery pageQuery) { public PageResp<L> page(Q query, PageQuery pageQuery) {
QueryWrapper<T> queryWrapper = this.buildQueryWrapper(query); QueryWrapper<T> queryWrapper = this.buildQueryWrapper(query);
IPage<T> page = baseMapper.selectPage(pageQuery.toPage(), queryWrapper); IPage<T> page = baseMapper.selectPage(pageQuery.toPage(), queryWrapper);
PageResp<L> pageResp = PageResp.build(page, listClass); PageResp<L> pageResp = PageResp.build(page, this.getListClass());
pageResp.getList().forEach(this::fill); pageResp.getList().forEach(this::fill);
return pageResp; return pageResp;
} }
@@ -91,7 +90,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
} }
// 如果构建简单树结构,则不包含基本树结构之外的扩展字段 // 如果构建简单树结构,则不包含基本树结构之外的扩展字段
TreeNodeConfig treeNodeConfig = TreeUtils.DEFAULT_CONFIG; TreeNodeConfig treeNodeConfig = TreeUtils.DEFAULT_CONFIG;
TreeField treeField = listClass.getDeclaredAnnotation(TreeField.class); TreeField treeField = this.getListClass().getDeclaredAnnotation(TreeField.class);
if (!isSimple) { if (!isSimple) {
// 根据 @TreeField 配置生成树结构配置 // 根据 @TreeField 配置生成树结构配置
treeNodeConfig = TreeUtils.genTreeNodeConfig(treeField); treeNodeConfig = TreeUtils.genTreeNodeConfig(treeField);
@@ -104,7 +103,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
tree.setName(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.nameKey()))); tree.setName(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.nameKey())));
tree.setWeight(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.weightKey()))); tree.setWeight(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.weightKey())));
if (!isSimple) { if (!isSimple) {
List<Field> fieldList = ReflectUtils.getNonStaticFields(listClass); List<Field> fieldList = ReflectUtils.getNonStaticFields(this.getListClass());
fieldList.removeIf(f -> CharSequenceUtil.equalsAnyIgnoreCase(f.getName(), treeField.value(), treeField fieldList.removeIf(f -> CharSequenceUtil.equalsAnyIgnoreCase(f.getName(), treeField.value(), treeField
.parentIdKey(), treeField.nameKey(), treeField.weightKey(), treeField.childrenKey())); .parentIdKey(), treeField.nameKey(), treeField.weightKey(), treeField.childrenKey()));
fieldList.forEach(f -> tree.putExtra(f.getName(), ReflectUtil.invoke(node, CharSequenceUtil.genGetter(f fieldList.forEach(f -> tree.putExtra(f.getName(), ReflectUtil.invoke(node, CharSequenceUtil.genGetter(f
@@ -115,7 +114,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
@Override @Override
public List<L> list(Q query, SortQuery sortQuery) { public List<L> list(Q query, SortQuery sortQuery) {
List<L> list = this.list(query, sortQuery, listClass); List<L> list = this.list(query, sortQuery, this.getListClass());
list.forEach(this::fill); list.forEach(this::fill);
return list; return list;
} }
@@ -123,7 +122,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
@Override @Override
public D get(Long id) { public D get(Long id) {
T entity = super.getById(id, false); T entity = super.getById(id, false);
D detail = BeanUtil.toBean(entity, detailClass); D detail = BeanUtil.toBean(entity, this.getDetailClass());
this.fill(detail); this.fill(detail);
return detail; return detail;
} }
@@ -175,9 +174,57 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
@Override @Override
public void export(Q query, SortQuery sortQuery, HttpServletResponse response) { public void export(Q query, SortQuery sortQuery, HttpServletResponse response) {
List<D> list = this.list(query, sortQuery, detailClass); List<D> list = this.list(query, sortQuery, this.getDetailClass());
list.forEach(this::fill); list.forEach(this::fill);
ExcelUtils.export(list, "导出数据", detailClass, response); ExcelUtils.export(list, "导出数据", this.getDetailClass(), response);
}
/**
* 获取当前列表信息类型
*
* @return 当前列表信息类型
*/
public Class<L> getListClass() {
if (this.listClass == null) {
this.listClass = (Class<L>)ClassUtils.getTypeArguments(this.getClass())[2];
}
return this.listClass;
}
/**
* 获取当前详情信息类型
*
* @return 当前详情信息类型
*/
public Class<D> getDetailClass() {
if (this.detailClass == null) {
this.detailClass = (Class<D>)ClassUtils.getTypeArguments(this.getClass())[3];
}
return this.detailClass;
}
/**
* 获取当前查询条件类型
*
* @return 当前查询条件类型
*/
public Class<Q> getQueryClass() {
if (this.queryClass == null) {
this.queryClass = (Class<Q>)ClassUtils.getTypeArguments(this.getClass())[4];
}
return this.queryClass;
}
/**
* 获取当前查询条件类型字段
*
* @return 当前查询条件类型字段列表
*/
public List<Field> getQueryFields() {
if (this.queryFields == null) {
this.queryFields = ReflectUtils.getNonStaticFields(this.getQueryClass());
}
return queryFields;
} }
/** /**
@@ -217,7 +264,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
} else { } else {
checkProperty = property; checkProperty = property;
} }
Optional<Field> optional = entityFields.stream() Optional<Field> optional = super.getEntityFields().stream()
.filter(field -> checkProperty.equals(field.getName())) .filter(field -> checkProperty.equals(field.getName()))
.findFirst(); .findFirst();
ValidationUtils.throwIf(optional.isEmpty(), "无效的排序字段 [{}]", property); ValidationUtils.throwIf(optional.isEmpty(), "无效的排序字段 [{}]", property);
@@ -248,7 +295,7 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
protected QueryWrapper<T> buildQueryWrapper(Q query) { protected QueryWrapper<T> buildQueryWrapper(Q query) {
QueryWrapper<T> queryWrapper = new QueryWrapper<>(); QueryWrapper<T> queryWrapper = new QueryWrapper<>();
// 解析并拼接查询条件 // 解析并拼接查询条件
return QueryWrapperHelper.build(query, queryFields, queryWrapper); return QueryWrapperHelper.build(query, this.getQueryFields(), queryWrapper);
} }
/** /**
@@ -307,31 +354,4 @@ public abstract class BaseServiceImpl<M extends BaseMapper<T>, T extends BaseIdD
protected void afterDelete(List<Long> ids) { protected void afterDelete(List<Long> ids) {
/* 删除后置处理 */ /* 删除后置处理 */
} }
/**
* 获取当前列表信息类型
*
* @return 当前列表信息类型
*/
protected Class<L> currentListClass() {
return (Class<L>)this.typeArgumentCache[2];
}
/**
* 获取当前详情信息类型
*
* @return 当前详情信息类型
*/
protected Class<D> currentDetailClass() {
return (Class<D>)this.typeArgumentCache[3];
}
/**
* 获取当前查询条件类型
*
* @return 当前查询条件类型
*/
protected Class<Q> currentQueryClass() {
return (Class<Q>)this.typeArgumentCache[4];
}
} }