Skip to content

Commit

Permalink
refactor(extension/crud): 调整 BaseService 相关泛型类型加载为懒加载
Browse files Browse the repository at this point in the history
  • Loading branch information
Charles7c committed Jul 16, 2024
1 parent a110bd9 commit dca7157
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,25 @@
*/
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
public T getById(Serializable id) {
return this.getById(id, true);
}

/**
* 获取当前实体类型字段
*
* @return 当前实体类型字段列表
*/
public List<Field> getEntityFields() {
if (this.entityFields == null) {
this.entityFields = ReflectUtils.getNonStaticFields(this.getEntityClass());
}
return this.entityFields;
}

/**
* 根据 ID 查询
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,17 +68,16 @@
*/
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());
protected final Class<L> listClass = this.currentListClass();
protected final Class<D> detailClass = this.currentDetailClass();
protected final Class<Q> queryClass = this.currentQueryClass();
private final List<Field> queryFields = ReflectUtils.getNonStaticFields(this.queryClass);
private Class<L> listClass;
private Class<D> detailClass;
private Class<Q> queryClass;
private List<Field> queryFields;

@Override
public PageResp<L> page(Q query, PageQuery pageQuery) {
QueryWrapper<T> queryWrapper = this.buildQueryWrapper(query);
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);
return pageResp;
}
Expand All @@ -91,7 +90,7 @@ public List<Tree<Long>> tree(Q query, SortQuery sortQuery, boolean isSimple) {
}
// 如果构建简单树结构,则不包含基本树结构之外的扩展字段
TreeNodeConfig treeNodeConfig = TreeUtils.DEFAULT_CONFIG;
TreeField treeField = listClass.getDeclaredAnnotation(TreeField.class);
TreeField treeField = this.getListClass().getDeclaredAnnotation(TreeField.class);
if (!isSimple) {
// 根据 @TreeField 配置生成树结构配置
treeNodeConfig = TreeUtils.genTreeNodeConfig(treeField);
Expand All @@ -104,7 +103,7 @@ public List<Tree<Long>> tree(Q query, SortQuery sortQuery, boolean isSimple) {
tree.setName(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.nameKey())));
tree.setWeight(ReflectUtil.invoke(node, CharSequenceUtil.genGetter(treeField.weightKey())));
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
.parentIdKey(), treeField.nameKey(), treeField.weightKey(), treeField.childrenKey()));
fieldList.forEach(f -> tree.putExtra(f.getName(), ReflectUtil.invoke(node, CharSequenceUtil.genGetter(f
Expand All @@ -115,15 +114,15 @@ public List<Tree<Long>> tree(Q query, SortQuery sortQuery, boolean isSimple) {

@Override
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);
return list;
}

@Override
public D get(Long id) {
T entity = super.getById(id, false);
D detail = BeanUtil.toBean(entity, detailClass);
D detail = BeanUtil.toBean(entity, this.getDetailClass());
this.fill(detail);
return detail;
}
Expand Down Expand Up @@ -175,9 +174,57 @@ public void delete(List<Long> ids) {

@Override
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);
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;
}

/**
Expand Down Expand Up @@ -217,7 +264,7 @@ protected void sort(QueryWrapper<T> queryWrapper, SortQuery sortQuery) {
} else {
checkProperty = property;
}
Optional<Field> optional = entityFields.stream()
Optional<Field> optional = super.getEntityFields().stream()
.filter(field -> checkProperty.equals(field.getName()))
.findFirst();
ValidationUtils.throwIf(optional.isEmpty(), "无效的排序字段 [{}]", property);
Expand Down Expand Up @@ -248,7 +295,7 @@ protected void fill(Object obj) {
protected QueryWrapper<T> buildQueryWrapper(Q query) {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
// 解析并拼接查询条件
return QueryWrapperHelper.build(query, queryFields, queryWrapper);
return QueryWrapperHelper.build(query, this.getQueryFields(), queryWrapper);
}

/**
Expand Down Expand Up @@ -307,31 +354,4 @@ protected void afterUpdate(C req, T entity) {
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];
}
}

0 comments on commit dca7157

Please sign in to comment.