1. 程式人生 > 其它 >自定義註解的理解和使用

自定義註解的理解和使用

1、自定義註解的理解

/**
 *
 *  一、自定義註解
 *  1、使用@interface 來標識
 *  2、內部成員變數通常使用value來表示
 *  3、可以指定成員變數的預設值 使用 default 來定義
 *  4、如果自定義的註解沒有 成員變數 表示一個標識的作用
 *
 *  5、如果註解有成員 在使用自定義的註解時需要給成員賦值,如果有了預設值就可以不用了
 *     但是不想用預設值可以自己重新的賦值
 *     @MyAnotation("hi")
 *
 * 二、元註解(對自定義註解進行修飾的註解,jdk自帶的)有4個
 *   1) @Target(ElementType.METHOD) 用來說明當前自定義的註解能修飾那些元素,類? 屬性? 還是方法等
 *       TYPE 類、介面、列舉類
 *       LOCAL_VARIABLE 區域性變數
 *
 *   2)  @Retention(RetentionPolicy.SOURCE)  指定 註解的生命週期
 *     SOURCE 是編譯階段存在 編譯好了就沒有 註解了
 *     CLASS  在.class 檔案裡面存在,但是不會載入到記憶體裡面,預設值
 *     RUNTIME 會載入到記憶體裡可以通過反射的方式獲取到,進而判斷註解是幹啥的
 *
 *   3) @Documented 表示所修飾的註解在被javadoc 解析時會保留
 *
 *   4)@Inherited 他修飾的註解類將具有繼承性,如果某個類使用我們自定義的註解那麼這個類的子類也具有該註解
 *
 *  三、通過反射來獲取註解資訊
 *
 *        Class clazz = Student.class;
 *        Annotation[] annotations = clazz.getAnnotations();
 *
 *        for (int i = 0; i < annotations.length; i++) {
 *          System.out.println(annotations[i]);
 *        }
 *
 *  四、jdk 8 新特性中的註解
 *
 *     1)可重複註解
 *
 *
 *  五、自定義註解的使用場景
 *
 *     實現自定義註解+攔截器,自定義註解+AOP
 *
 *
 *
 *
 */

2、建立自定義註解

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE,METHOD,FIELD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})
public @interface MyAnotation {

    String value() default "hello"; //注意這裡是成員屬性,並提供預設的值
}

3、註解配合攔截器實現許可權的控制

3.1 建立一個interceptor

public class SourceAccessInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("進入攔截器了");

        // 反射獲取方法上的LoginRequred註解
        HandlerMethod handlerMethod = (HandlerMethod)handler;
        MyAnotation myAnotation = handlerMethod.getMethod().getAnnotation(MyAnotation.class);
        if(myAnotation == null){
            return true;
        }

        // 有LoginRequired註解說明需要登入,提示使用者登入
        response.setContentType("application/json; charset=utf-8");
        response.getWriter().print("你訪問的資源需要登入");
        return false;

    }


    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }


    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

3.2建立配置類把攔截器新增到攔截器鏈中

@Configuration
public class InterceptorTrainConfigurer implements WebMvcConfigurer {

    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SourceAccessInterceptor()).addPathPatterns("/**");
    }
}

3.3 使用自定義註解

   @MyAnotation
    @RequestMapping("/hello1")
    @ResponseBody
    public String hello1(){

        String name =  myService.sayHello("tomcat");
        System.out.println(name);
        return name;
    }

3.4 效果