在日常工作中,我们经常需要自定义注解去满足自己的需求,一个注解里面一般都会定义几个参数以便于我们获取值使用的,但是偶尔我们也会有这样的需求,需要根据前端传过来的参数进行动态的传参,那么我们该如何去使用呢,接下来我贴上一个demo进行验证。
这是我们要使用的注解,很常规
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource{
public String value() default "";
}
我们的切面拦截去处理EL表达式
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.annotation.Order;
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 org.springframework.stereotype.Component;
@Aspect
@Order(1)
@Component
public class DataSourceAspect{
//切入点
@Pointcut("@annotation(com.spring.framework.aop.DataSource)")
public void pointCut(){}
@Before("pointCut()")
public void doBefore(JoinPoint point) throws Throwable{
Signature signature = point.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
if (method != null){
if(method.getAnnotation(DataSource.class)!=null) {
DataSource datasource = method.getAnnotation(DataSource.class);
String value = datasource.value();
Object[] args = point.getArgs();
if(args.length>0){//说明有参数
ExpressionParser parser = new SpelExpressionParser();
LocalVariableTableParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
String[] params = discoverer.getParameterNames(method);
EvaluationContext context = new StandardEvaluationContext();
for (int len = 0; len < params.length; len++) {
context.setVariable(params[len], args[len]);
}
Expression expression = parser.parseExpression(value);
value = expression.getValue(context, String.class);
}
System.err.println("aop输出结果:"+value);
}
}
}
}
下面贴上我们的三个测试方法以及测试结果