期望: 使用SpringBoot + AOP, 自己定义一个注解,通过AOP拦截放置了注解的方法。
存在问题:当注解放置在带有GetMapping等controller入口注解的方法上能拦截到,但是注解放到其他方法上拦截不到。
主要代码:
- 注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lock {
}
2.切面
@Aspect
@Component
public class HelloAspect {
@Around("@annotation(myLock)")
public Object around(ProceedingJoinPoint pjp, Lock myLock) {
//获取注解里的值
System.out.println("in around");
try {
return pjp.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
return null;
}
}
}
3.Controller
@RestController
public class HelloController {
// 防在这里可以拦截
@GetMapping("/hello2")
@Lock
public String hello2() {
return "hello2";
}
@GetMapping("/hello")
public String hello() {
a();
return "hello";
}
// 放在这里拦截不到
@Lock
protected void a(){
System.out.println("aaa");
}
}
helloController是代理对象,调用AOP才会生效,
直接调用a()方法是当前对象调用,不是代理对象,所以无效