自定义注解

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 }

 

posted @ 2020-04-20 22:57  RollBack2010  阅读(138)  评论(0编辑  收藏  举报