注解开发
元注解
@Target(ElementType)
修饰的这个注解的使用范围,即被描述的注解可以用在哪里。
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR)——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包**
也可以是个数组**@Target({ElementType.TYPE, ElementType.METHOD})**
@Retention(RetentionPolicy)
注解的生存周期,即会保留到哪个阶段。
- SOURCE. 注解保留在源代码中,但是编译的时候会被编译器所丢弃。比如@Override, @SuppressWarnings;
- CLASS. 这是默认的policy。注解会被保留在class文件中,但是在运行时期间就不会识别这个注解;
- RUNTIME. 注解会被保留在class文件中,同时运行时期间也会被识别。所以可以使用反射机制获取注解信息。比如@Deprecated。
自定义注解
@interface就是用来定义注解的,类似于class定义类 和 interface 定义接口
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoCheck {
String value() default "";
}
String value() default"“;定义一个value()的方法,返回值类型时String没有赋值默认返回”"这个字符串
定义注解配置类
@Aspect
@Component
@Slf4j
public class AutoInterceptor {
static {
log.info("AutoInterceptor run ...");
}
@Pointcut("execution(* *(..))")
private void pointCut() {
}
@Around("pointCut() && @annotation(autoCheck)")
public void beforeCheckBean(JoinPoint point, AutoCheck autoCheck) throws Exception {
// 判断注解中的属性是否为空
if(autoCheck.value().equals("")){
System.out.println("autoCheck:"+"注解属性为空");
}else {
System.out.println(autoCheck.value());
}
}
}
测试
@RestController
public class UserController {
@GetMapping("/user")
@AutoCheck(value = "testAutoCheck")
public String test(){
return "testuser";
}
}
成功…