【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
**开源地址:https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB **
@RestController
public class HiController {
@GetMapping(“/hi”)
public String sayHello() {
System.out.println(“hi, good morning~”);
return “hi bro ~”;
}
}
我这个controller是放在Pointcut对应com.example.mydemos.controller包下的,所以该包下的所有类的所有方法都会被增强
先假设后验证
按照上述demo
当我访问"/hi"时,会先执行@Before对应方法,输出"before…“,再执行HiController 中的sayHello方法,输出"hi, good morning~”,并且返回"hi bro ~“,最后执行@After对应方法,输出"after…”
验证:
项目跑起来访问"/hi"
控制台
一个最基础的aop实现完毕,接下来搞点进阶操作
- 获取目标方法参数
再来个测试controller
@RestController
public class HelloController {
@GetMapping(“/hello/{title}/{content}”)
public String sayHello(@PathVariable(“title”) String title, @PathVariable(“content”) String content) {
System.out.println(title + “:” + content);
return “hello ya~”;
}
}
现在我们有两个controller,顺便能测试下execution规则是否生效,我的规则是com.example.mydemos.controller下的所有方法都增强
HelloController的sayHello方法有两个参数title和content,看我们能不能拿到
获取目标方法参数需要用到JoinPoint,经测试,在@Before和@After中均能获取
@Before(“controllerPointcut()”)
public void beforeExecute(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
List list = Arrays.asList(args);
System.out.println(“before中的目标方法参数”);
list.forEach(System.out::println);
System.out.println(“before…”);
}
@After(“controllerPointcut()”)
public void afterExecute(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
List list = Arrays.asList(args);
System.out.println(“after中的目标方法参数”);
list.forEach(System.out::println);
System.out.println(“after…”);
}
joinPoint.getArgs()会返回一个object数组,这就是你的目标方法参数
测试
结果
- 获取目标方法名
所有符合规则的方法都会被增强,那我怎么知道当前执行的是哪个方法呢?
@Before(“controllerPointcut()”)
public void beforeExecute(JoinPoint joinPoint) {
String name = joinPoint.getSignature().getName();
System.out.println(“before中的方法名:”+name);
System.out.println(“before…”);
}
@After(“controllerPointcut()”)
public void afterExecute(JoinPoint joinPoint) {
String name = joinPoint.getSignature().getName();
System.out.println(“after中的方法名:”+name);
System.out.println(“after…”);
}
joinPoint.getSignature().getName()返回的就是方法名
- 获取目标方法返回值
这个就需要用到@Around或者@AfterReturning
一、@Around
@Around(“controllerPointcut()”)
public Object aruondExecute(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println(“around before…”);
String name = joinPoint.getSignature().getName();
Object o = joinPoint.proceed();
System.out.println(“方法” + name + “的返回值是” + o);
System.out.println(“around after…”);