1.获取方法参数
// 定义切点
@Pointcut("@annotation(com.example.springbootredisson.annotation.Lock)")
public void pointCut(){
}
@Around("pointCut()")
public Object pointCut(ProceedingJoinPoint joinPoint){
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
//获取注解参数值
Lock lock = methodSignature.getMethod().getAnnotation(Lock.class);
String prefix = lock.prefix();
String spELString = lock.suffix();
// 通过joinPoint获取被注解方法
String value = generateKeyBySpEL(spELString, joinPoint);
// 解析后的参数可以继续做后续增加业务处理 例:加锁
// 执行业务逻辑
return joinPoint.proceed();
}
2.解析SPEL中的表达式
if(StringUtils.isBlank(spELString)){
return null;
}
// 通过joinPoint获取被注解方法
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
//创建解析器
SpelExpressionParser parser = new SpelExpressionParser();
//获取表达式
Expression expression = parser.parseExpression(spELString);
//设置解析上下文(有哪些占位符,以及每种占位符的值)
EvaluationContext context = new StandardEvaluationContext();
//获取参数值
Object[] args = joinPoint.getArgs();
//获取运行时参数的名称
DefaultParameterNameDiscoverer discoverer = new DefaultParameterNameDiscoverer();
String[] parameterNames = discoverer.getParameterNames(method);
for (int i = 0; i < parameterNames.length; i++) {
context.setVariable(parameterNames[i],args[i]);
}
//解析,获取替换后的结果
String result = expression.getValue(context).toString();
System.out.println(result);
return result;
3.使用方法
/**
* get请求,解析请求头中的参数
* @param orderId
*/
@GetMapping("test")
@Lock(prefix = "test",suffix = "#orderId")
public void test(@RequestParam(value = "orderId") Integer orderId){
System.out.println(orderId);
}
/**
* post请求,解析请求体中的参数
* @param id
*/
@Lock(prefix = "test",suffix = "#user.id")
@PostMapping("goods")
public void goods(@RequestBody User user){
System.out.println(user);
}