1.自定义注解的三个注释
- @Documented 注解规范,就当是注解的标注
- @Retention 注解的注解,用来阐述该注解的生效周期,一般是runtime,运行时生效
- @Target 这个是让该注解对什么地方生效,类上还是方法上,方法上居多
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AnnotationLog{
String value() default "";
// 该value是注解的属性,可以换成zhangsan都是可以的
String zhangsan() default "";
}
AOP
面向切面编程,对代码做增强完善的
@Aspect
@Component
public class AopLog {
@Pointcut(value = "@annotation(com.jason.annotation.DefinetionLog)")
public void test(){
}
@AfterReturning(value = "test()",returning = "res")
public void test1(JoinPoint point,Object res){
MethodSignature signature = (MethodSignature) point.getSignature();
DefinetionLog annotation = signature.getMethod().getAnnotation(DefinetionLog.class);
annotation.value();
annotation.zhangsan();
System.out.println(res);
}
也可以把切点表达式和切通知方法结合一下,更整洁
@AfterReturning(pointcut = "@annotation(com.jason.annotation.DefinetionLog)",returning = "result")
public void show(JoinPoint joinPoint, Object result){
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
DefinetionLog annotation = signature.getMethod().getAnnotation(DefinetionLog.class);
System.out.println(annotation.value());
System.out.println(annotation.zhangsan());
System.out.println(result);
}
然后就可以在controller包里建一个AnnoController类
@RestController
@RequestMapping("/test")
public class AnnoController {
@RequestMapping("/all")
@DefinetionLog(value = "12",zhangsan = "牛逼")
public String test(){
return "去你妈的";
}
}