自定义注释
package main.Controller;
import java.lang.annotation.*;
//@Documented 注解
// 功能:指明修饰的注解,可以被例如javadoc此类的工具文档化,只负责标记,没有成员取值。
@Documented
//@Retention 注解
//功能:指明修饰的注解的生存周期,即会保留到哪个阶段。
//RetentionPolicy的取值包含以下三种:
//SOURCE:源码级别保留,编译后即丢弃。
//CLASS:编译级别保留,编译后的class文件中存在,在jvm运行时丢弃,这是默认值。
//RUNTIME: 运行级别保留,编译后的class文件中存在,在jvm运行时保留,可以被反射调用。
@Retention(RetentionPolicy.RUNTIME)
//@Target 注解
// 功能:指明了修饰的这个注解的使用范围,即被描述的注解可以用在哪里。
// ElementType的取值包含以下几种:
//
// TYPE:类,接口或者枚举
// FIELD:域,包含枚举常量
// METHOD:方法
// PARAMETER:参数
// CONSTRUCTOR:构造方法
// LOCAL_VARIABLE:局部变量
// ANNOTATION_TYPE:注解类型
// PACKAGE:包
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String value() default "500";
}
package main.Controller;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* @ClassName TestAspect
* @Description TODO
* @Date 2019/2/25/02515:12
* @Version 1.0
**/
//配置切面
@Aspect
@Component
public class TestAspect {
//这个是环绕通知,这个方法是将你所注释的方法放在其内部运行,因此你所著是的方法的返回值将会丢失,百年城返回@around的返回值。
// @annotation(main.Controller.MyAnnotation)指向你的注释类
@Around("@annotation(main.Controller.MyAnnotation)")
public void Interceptor(ProceedingJoinPoint joinPoint){
// try {
// return joinPoint.proceed();
// }catch (Throwable e){
try {
//执行方法 @GetMapping("/add1")
// public String addData1(String deviceId) {
// System.out.println("=====addData1=====");
// return "success";
// }
// 和@before方法
joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
System.out.println("around");
}
@Before("@annotation(main.Controller.MyAnnotation)")
public void before(JoinPoint joinPoint){
MethodSignature sign = (MethodSignature)joinPoint.getSignature();
Method method = sign.getMethod();
//获取到注释的内容
MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
System.out.println("打印:" + annotation.value() + " 开始前");
// //System.out.println("===开始前===");
System.out.println("before");
}
@After("@annotation(main.Controller.MyAnnotation)")
public void after() {
System.out.println("after");
}
}
package main.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName TestController
* @Description TODO
* @Date 2019/2/25/02515:07
* @Version 1.0
**/
@RestController
@RequestMapping("/add2")
public class TestController {
@MyAnnotation("200")
@GetMapping("/add1")
public String addData1() {
System.out.println("=====addData1=====");
return "success";
}
}