自定义注解
1.元注解(定义到注解上的注解)
@Retention:注解的生命周期
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) // 默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) // 注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target:注解的作用目标(使用位置)
@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) ///包
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
2.定义注解
默认参数是value,在调用的时候,如果默认参数只有一个value,可直接写@AnnotationTest(“val”),否则需要指明参数名赋值 @AnnotationTest(value=“val”,name="nameval")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AnnotationTest {
String value();
String name() default "default_name";//可设置默认值
String[] arr();//可定义数组
}
//-------------------------使用方法如下
@RestController
@RequestMapping(value = "annotationTest")
public class AnnotationController {
@GetMapping("/test")
@AnnotationTest(value = "val",name = "n2",arr = {"1","2"})
public void test(){
}
}
3.定义拦截器
1 public class AnnotationInterceptor implements HandlerInterceptor { 2 @Override 3 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 4 HandlerMethod method= (HandlerMethod) handler;//获得调用方法 5 AnnotationTest methodAnnotation = method.getMethodAnnotation(AnnotationTest.class);//获得这个方法上的注解,使用这个可得到传入注解的参数 6 boolean hasMethodAnnotation = method.hasMethodAnnotation(AnnotationTest.class);//判断执行的方法有没有指定的注解,有返回true 7 if(hasMethodAnnotation){ 8 //如果包含指定注解,可以进行判断是否登录,是否有权限等等 9 } 10 return false; 11 } 12 }
4.启用拦截器
1 @Configuration 2 public class conf extends WebMvcConfigurationSupport { 3 @Override 4 protected void addInterceptors(InterceptorRegistry registry) { 5 registry.addInterceptor(annotationInterceptor()) 6 .addPathPatterns("/**") 7 .excludePathPatterns("/swagger*","**/*.js","**/*.css","**/*.png");; 8 } 9 @Bean 10 public AnnotationInterceptor annotationInterceptor(){ 11 return new AnnotationInterceptor(); 12 } 13 }
4.拦截器获得相关方法、参数
1 public class AnnotationInterceptor implements HandlerInterceptor { 2 @Override 3 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 4 HandlerMethod method= (HandlerMethod) handler;//获得调用方法 5 AnnotationTest methodAnnotation = method.getMethodAnnotation(AnnotationTest.class);//获得这个方法上的注解,使用这个可得到传入注解的参数 6 boolean hasMethodAnnotation = method.hasMethodAnnotation(AnnotationTest.class);//判断执行的方法有没有指定的注解,有返回true 7 if(hasMethodAnnotation){ 8 //如果包含指定注解,可以进行判断是否登录,是否有权限等等验证、限流操作 9 } 10 return true;//返回true,原方法执行,否则不执行 11 } 12 }