1、自定义注解
@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
}
2、切面类
@Aspect
@Component
public class MyAnnotationAspect {
/**
* 定义切点,拦截的位置,可避免下面重复声明变量
*/
@Pointcut("@annotation(com.yjz.common.annotation.MyAnnotation)")
private void pointCut(){}
// @Before("@annotation(myAnnotation)")
// public void doBefore(JoinPoint joinPoint, MyAnnotation myAnnotation){
//
// }
@Before("pointCut()")
public void doBefore(JoinPoint joinPoint){
System.out.println("-----切入点的相关信息-----");
//目标方法的传入参数
Object[] args = joinPoint.getArgs();
System.out.println("共"+args.length+"个参数");
for (int i = 0; i < args.length; i++) {
System.out.println("第"+i+1+"个参数为:"+args[i]);
}
//获取目标方法信息
Signature signature = joinPoint.getSignature();
System.out.println("目标方法名为:"+signature.getName());
System.out.println("目标方法信息:"+signature);
//可获取所属类,然后获取所属类的相关信息
System.out.println("目标方法所属类名:"+signature.getDeclaringTypeName());
System.out.println("目标方法所属类简单类名:"+signature.getDeclaringType().getSimpleName());
System.out.println("----切入点相关信息----");
System.out.println("");
System.out.println("step0(Before)-目标方法"+signature.getName()+"执行前的操作。。。。");
}
@AfterReturning("pointCut()")
public void doAfterReturning(JoinPoint joinPoint){
Signature signature = joinPoint.getSignature();
System.out.println("step2(AfterReturning)-目标方法"+signature.getName()+"返回值后的操作。。。。");
}
@After("pointCut()")
public void doAfter(JoinPoint joinPoint){
Signature signature = joinPoint.getSignature();
System.out.println("step3(After)-目标方法"+signature.getName()+"执行后的操作。。。。");
}
@Around("pointCut()")
public Object doAround(ProceedingJoinPoint joinPoint){
System.out.println("---以下内容会在Before之前执行---");
Object[] args = joinPoint.getArgs();
System.out.println("共"+args.length+"个参数");
for (int i = 0; i < args.length; i++) {
System.out.println("第"+(i+1)+"个参数的旧值为:"+args[i]);
}
//改变参数值
args[0]="New Hello";
System.out.println("参数新值:"+args[0]);
System.out.println("---以上内容会在Before之前执行---");
System.out.println();
//执行目标方法
Object result=null;
try {
result=joinPoint.proceed(args);
} catch (Throwable throwable) {
System.out.println("执行目标方法异常。");
}
System.out.println();
System.out.println("---以下内容会在After之后执行---");
if(result instanceof String){
//改变返回值
result="Happy New Year";
System.out.println("增强后的返回值"+result);
}
System.out.println("---以上内容会在After之后执行---");
return result;
}
}
3、服务类
@Service
@Slf4j
public class MyAnnotationService {
@MyAnnotation
public String helloAop(String param){
System.out.println("step1-方法helloAop执行开始。。。。");
return param;
}
}
4、接口类
@RestController
@RequestMapping("/yjz")
public class MyController {
@Autowired
private MyAnnotationService myAnnotationService;
@PostMapping("/testHelloAop")
public JSONObject testHelloAop(@RequestParam String param){
String result=myAnnotationService.helloAop(param);
return JSONObject.parseObject("{\"message\":\"SUCCESS\",\"code\":200,\"result\":\"" +result+
"\"}");
}
}
5、测试结果
---以下内容会在Before之前执行---
共1个参数
第1个参数的旧值为:hello
参数新值:New Hello
---以上内容会在Before之前执行---
-----切入点的相关信息-----
共1个参数
第01个参数为:New Hello
目标方法名为:helloAop
目标方法信息:String com.yjz.first.service.MyAnnotationService.helloAop(String)
目标方法所属类名:com.yjz.first.service.MyAnnotationService
目标方法所属类简单类名:MyAnnotationService
----切入点相关信息----
step0(Before)-目标方法helloAop执行前的操作。。。。
step1-方法helloAop执行开始。。。。
step2(AfterReturning)-目标方法helloAop返回值后的操作。。。。
step3(After)-目标方法helloAop执行后的操作。。。。
---以下内容会在After之后执行---
增强后的返回值Happy New Year
---以上内容会在After之后执行---