content: package org.jeecg.boot.starter.lock.aspect;
  
  import lombok.extern.slf4j.Slf4j;
  import org.springframework.expression.EvaluationContext;
  import org.springframework.expression.Expression;
  import org.springframework.expression.ExpressionParser;
  import org.springframework.expression.spel.standard.SpelExpressionParser;
  import org.springframework.expression.spel.support.StandardEvaluationContext;
  
  import java.util.ArrayList;
  import java.util.List;
  
  /**
   * @author zyf
   */
  @Slf4j
  public class BaseAspect {
  
      /**
       * 通过spring SpEL 获取参数
       *
       * @param key            定义的key值 以#开头 例如:#user
       * @param parameterNames 形参
       * @param values         形参值
       * @param keyConstant    key的常亮
       * @return
       */
      public List<String> getValueBySpEL(String key, String[] parameterNames, Object[] values, String keyConstant) {
          List<String> keys = new ArrayList<>();
          if (!key.contains("#")) {
              String s = "redis:lock:" + key + keyConstant;
              log.info("lockKey:" + s);
              keys.add(s);
              return keys;
          }
          //spel解析器
          ExpressionParser parser = new SpelExpressionParser();
          //spel上下文
          EvaluationContext context = new StandardEvaluationContext();
          for (int i = 0; i < parameterNames.length; i++) {
              context.setVariable(parameterNames[i], values[i]);
          }
          Expression expression = parser.parseExpression(key);
          Object value = expression.getValue(context);
          if (value != null) {
              if (value instanceof List) {
                  List value1 = (List) value;
                  for (Object o : value1) {
                      addKeys(keys, o, keyConstant);
                  }
              } else if (value.getClass().isArray()) {
                  Object[] obj = (Object[]) value;
                  for (Object o : obj) {
                      addKeys(keys, o, keyConstant);
                  }
              } else {
                  addKeys(keys, value, keyConstant);
              }
          }
          log.info("表达式key={},value={}", key, keys);
          return keys;
      }
  
      private void addKeys(List<String> keys, Object o, String keyConstant) {
          keys.add("redis:lock:" + o.toString() + keyConstant);
      }
  }
  