自定義註解的理解和使用
阿新 • • 發佈:2021-06-20
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; }