自定义注解
package com.lv.swaggerdemo.aop;
import java.lang.annotation.*;
@Target(ElementType.METHOD)
@Inherited
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {//自定义注解,在注解上的方法将执行代理流程
String key();
}
使用自定义注解使用el表达式设置动态值
package com.lv.swaggerdemo.aop;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@MyAnnotation(key = "'param id is ' + #id")//添加自定义aop注解 #id为el表达式,需要和被替换的参数名称相同
public void dosome(String id,Person person){
System.out.println("方法执行中");
}
}
切面类动态替换值
package com.lv.swaggerdemo.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.spel.standard.SpelExpression;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
//切面类必须由容器管理
@Component
//定义为切面类
@Aspect
public class MyAspect {
//定义切入点
@Pointcut("@annotation(com.lv.swaggerdemo.aop.MyAnnotation)")
public void pointCut(){}
@Around("pointCut()")
public Object dosome(ProceedingJoinPoint joinPoint) throws Throwable {
//获取方法签名
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
//获取切入方法的对象
Method method = signature.getMethod();
//获取方法上的Aop注解
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
//获取注解上的值如 : @MyAnnotation(key = "'param id is ' + #id")
String keyEl = annotation.key();
//将注解的值中的El表达式部分进行替换
//创建解析器
SpelExpressionParser parser = new SpelExpressionParser();
//获取表达式
Expression expression = parser.parseExpression(keyEl);
//设置解析上下文(有哪些占位符,以及每种占位符的值)
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].toString());
}
//解析,获取替换后的结果
String result = expression.getValue(context).toString();
System.out.println(result);
return null;
}
}