1.定义注解
package com.tool.p2;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author
* @date 2019/9/27 下午8:31
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Rcd {
String key();
String age();
}
2.定义方法:
package com.tool.sev;
import com.p2.Rcd;
import org.springframework.stereotype.Component;
/**
* @author
* @date 2019/9/28 上午11:10
*/
@Component
public class Priority {
@Rcd(key = "#id", age = "#age")
public Object findPrioritis(String id, int age) {
System.out.println("id:" + id + ",查询中...");
System.out.println("age:" + age + "..");
return null;
}
}
3.定义切面
package com.tool.p1;
import com.tool.p2.Rcd;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
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;
import java.lang.reflect.Method;
/**
* @author
* @date 2019/9/27 下午8:29
*/
@Component
@Aspect
public class CacheAspect {
@Around("@annotation(com.tool.p2.Rcd)")
public Object doAnything(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("start......");
String key;
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = joinPoint.getTarget().getClass().getMethod(signature.getName(), signature.getMethod().getParameterTypes());
Rcd annotation = method.getAnnotation(Rcd.class);
String keyEL = annotation.key();
String ageEL = annotation.age();
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(keyEL);
Expression expression2 = parser.parseExpression(ageEL);
EvaluationContext context = new StandardEvaluationContext();
ParameterNameDiscoverer discoverer = new LocalVariableTableParameterNameDiscoverer();
String[] parameterNames = discoverer.getParameterNames(method);
Object[] args = joinPoint.getArgs();
for (int i = 0; i < parameterNames.length; i++) {
context.setVariable(parameterNames[i], args[i]);
// context.setVariable("userId", "Tom");
}
key = expression.getValue(context).toString();
String age = expression2.getValue(context).toString();
System.out.println("执行切点方法前的key :" +key);
System.out.println("执行切点方法前的age :" +age);
joinPoint.proceed();//真正的执行 切点 findPrioritis 方法。
System.out.println("执行切点方法后的key :" +key);
System.out.println("执行切点方法后的age :" +age);
System.out.println("end......");
return null;
}
}
4.测试:
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
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;
/**
* @author
* @date 2019/9/28 上午11:12
*/
public class ToolTest extends AbstractTestCase {
@Autowired
private Priority priority;
@Test
public void testPlaceholder() {
String template = "%s 今年 %d 岁了!";
String name = "Tom";
String words = String.format(template, name, 3);
System.out.println(words);
}
@Test
public void testSPEL() {
String eldemo = "'hello:' + #userId + ',你的编号:' + #num";
//1.创建解析器
ExpressionParser parser = new SpelExpressionParser();
Expression expression = parser.parseExpression(eldemo);
//2.设置解析上下文(有哪些占位符,以及占位符的值)
EvaluationContext context = new StandardEvaluationContext();
context.setVariable("userId", "Tom");
context.setVariable("num", "17958");
//3.解析
String result = expression.getValue(context).toString();
System.out.println(result + "\n");
}
@Test
public void testAop() {
priority.findPrioritis("no123", 18);
}
}
End!