1616
1717package 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 ;
2820import com .baomidou .mybatisplus .core .toolkit .StringUtils ;
2921import com .baomidou .mybatisplus .extension .plugins .handler .DataPermissionHandler ;
30-
31- import cn .hutool .core .text .CharSequenceUtil ;
32- import cn .hutool .extra .spring .SpringUtil ;
3322import net .sf .jsqlparser .expression .Expression ;
3423import net .sf .jsqlparser .expression .Function ;
3524import net .sf .jsqlparser .expression .LongValue ;
4231import net .sf .jsqlparser .statement .select .ParenthesedSelect ;
4332import net .sf .jsqlparser .statement .select .PlainSelect ;
4433import net .sf .jsqlparser .statement .select .SelectItem ;
34+ import org .slf4j .Logger ;
35+ import org .slf4j .LoggerFactory ;
4536import top .continew .starter .core .constant .StringConstants ;
4637import top .continew .starter .data .enums .DatabaseType ;
4738import top .continew .starter .data .util .MetaUtils ;
4839import top .continew .starter .extension .datapermission .annotation .DataPermission ;
4940import top .continew .starter .extension .datapermission .constant .DataPermissionConstants ;
5041import top .continew .starter .extension .datapermission .enums .DataScope ;
5142import top .continew .starter .extension .datapermission .exception .DataPermissionException ;
52- import top .continew .starter .extension .datapermission .provider .DataPermissionUserDataProvider ;
5343import top .continew .starter .extension .datapermission .model .RoleData ;
5444import 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