Skip to content

Commit a4fe07b

Browse files
wangjiangtao2Charles7c
authored andcommitted
perf(extension/datapermission): DataPermission 注解增加缓存处理
* 缓存Mapper接口方法上携带@DataPermission的值。
1 parent 14eed57 commit a4fe07b

File tree

1 file changed

+35
-16
lines changed
  • continew-starter-extension/continew-starter-extension-datapermission/continew-starter-extension-datapermission-mp/src/main/java/top/continew/starter/extension/datapermission/handler

1 file changed

+35
-16
lines changed

continew-starter-extension/continew-starter-extension-datapermission/continew-starter-extension-datapermission-mp/src/main/java/top/continew/starter/extension/datapermission/handler/DefaultDataPermissionHandler.java

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,9 @@
1616

1717
package top.continew.starter.extension.datapermission.handler;
1818

19-
import java.lang.reflect.Method;
20-
import java.util.Collections;
21-
import java.util.Set;
22-
23-
import javax.sql.DataSource;
24-
25-
import org.slf4j.Logger;
26-
import org.slf4j.LoggerFactory;
27-
19+
import cn.hutool.extra.spring.SpringUtil;
2820
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
2921
import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
30-
31-
import cn.hutool.core.text.CharSequenceUtil;
32-
import cn.hutool.extra.spring.SpringUtil;
3322
import net.sf.jsqlparser.expression.Expression;
3423
import net.sf.jsqlparser.expression.Function;
3524
import net.sf.jsqlparser.expression.LongValue;
@@ -42,16 +31,25 @@
4231
import net.sf.jsqlparser.statement.select.ParenthesedSelect;
4332
import net.sf.jsqlparser.statement.select.PlainSelect;
4433
import net.sf.jsqlparser.statement.select.SelectItem;
34+
import org.slf4j.Logger;
35+
import org.slf4j.LoggerFactory;
4536
import top.continew.starter.core.constant.StringConstants;
4637
import top.continew.starter.data.enums.DatabaseType;
4738
import top.continew.starter.data.util.MetaUtils;
4839
import top.continew.starter.extension.datapermission.annotation.DataPermission;
4940
import top.continew.starter.extension.datapermission.constant.DataPermissionConstants;
5041
import top.continew.starter.extension.datapermission.enums.DataScope;
5142
import top.continew.starter.extension.datapermission.exception.DataPermissionException;
52-
import top.continew.starter.extension.datapermission.provider.DataPermissionUserDataProvider;
5343
import top.continew.starter.extension.datapermission.model.RoleData;
5444
import top.continew.starter.extension.datapermission.model.UserData;
45+
import top.continew.starter.extension.datapermission.provider.DataPermissionUserDataProvider;
46+
47+
import javax.sql.DataSource;
48+
import java.lang.reflect.Method;
49+
import java.util.Collections;
50+
import java.util.Map;
51+
import java.util.Set;
52+
import java.util.concurrent.ConcurrentHashMap;
5553

5654
/**
5755
* 默认数据权限处理器
@@ -64,6 +62,10 @@ public class DefaultDataPermissionHandler implements DataPermissionHandler {
6462

6563
private static final Logger log = LoggerFactory.getLogger(DefaultDataPermissionHandler.class);
6664
private final DataPermissionUserDataProvider dataPermissionUserDataProvider;
65+
/**
66+
* Mapper类中所有方法数据权限注解缓存
67+
*/
68+
private final Map<String, Map<String, DataPermission>> annotationCache = new ConcurrentHashMap<>();
6769

6870
public DefaultDataPermissionHandler(DataPermissionUserDataProvider dataPermissionUserDataProvider) {
6971
this.dataPermissionUserDataProvider = dataPermissionUserDataProvider;
@@ -98,19 +100,36 @@ private DataPermission findDataPermissionAnnotation(String mappedStatementId) {
98100
String className = mappedStatementId.substring(0, lastDotIndex);
99101
String methodName = mappedStatementId.substring(lastDotIndex + 1);
100102

103+
// 先根据类名从缓存获取,如果methodAnnotations不为空,则说明该类中的所有方法都已缓存, 只是值为null。
104+
Map<String, DataPermission> methodAnnotations = annotationCache.get(className);
105+
if (methodAnnotations != null) {
106+
// methodName 可能是 ** 或者 **_COUNT
107+
return methodAnnotations.getOrDefault(methodName, methodAnnotations
108+
.get(methodName + DataPermissionConstants.COUNT_METHOD_SUFFIX));
109+
}
110+
111+
// 缓存未命中,执行反射操作
101112
Class<?> clazz = Class.forName(className);
102113
Method[] methods = clazz.getMethods();
103114

115+
// 创建新的缓存映射
116+
Map<String, DataPermission> newMethodAnnotations = new ConcurrentHashMap<>();
117+
118+
// 缓存所有带@DataPermission注解的方法
104119
for (Method method : methods) {
105120
String name = method.getName();
106-
if (CharSequenceUtil.equalsAny(methodName, name, name + DataPermissionConstants.COUNT_METHOD_SUFFIX)) {
107-
return method.getAnnotation(DataPermission.class);
121+
DataPermission annotation = method.getAnnotation(DataPermission.class);
122+
if (annotation != null) {
123+
newMethodAnnotations.put(name, annotation);
108124
}
109125
}
126+
// 存入缓存
127+
annotationCache.put(className, newMethodAnnotations);
128+
129+
return newMethodAnnotations.get(methodName);
110130
} catch (ClassNotFoundException e) {
111131
throw DataPermissionException.methodNotFound(mappedStatementId);
112132
}
113-
return null;
114133
}
115134

116135
/**

0 commit comments

Comments
 (0)