精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Spring自定義注解玩法大全,從入門到…

開發 后端
在業務開發過程中我們會遇到形形色色的注解,但是框架自有的注解并不是總能滿足復雜的業務需求,我們可以自定義注解來滿足我們的需求。

[[354020]]

 在業務開發過程中我們會遇到形形色色的注解,但是框架自有的注解并不是總能滿足復雜的業務需求,我們可以自定義注解來滿足我們的需求。

根據注解使用的位置,文章將分成字段注解、方法、類注解來介紹自定義注解。

字段注解

字段注解一般是用于校驗字段是否滿足要求,hibernate-validate依賴就提供了很多校驗注解 ,如@NotNull、@Range等,但是這些注解并不是能夠滿足所有業務場景的。

比如我們希望傳入的參數在指定的String集合中,那么已有的注解就不能滿足需求了,需要自己實現。

自定義注解

定義一個@Check注解,通過@interface聲明一個注解 

  1. @Target({ ElementType.FIELD}) //只允許用在類的字段上  
  2. @Retention(RetentionPolicy.RUNTIME) //注解保留在程序運行期間,此時可以通過反射獲得定義在某個類上的所有注解  
  3. @Constraint(validatedBy = ParamConstraintValidated.class)  
  4. public @interface Check {  
  5.     /**  
  6.      * 合法的參數值  
  7.      * */  
  8.     String[] paramValues();  
  9.     /**  
  10.      * 提示信息  
  11.      * */  
  12.     String message() default "參數不為指定值";  
  13.     Class<?>[] groups() default {};  
  14.     Class<? extends Payload>[] payload() default {};  

@Target 定義注解的使用位置,用來說明該注解可以被聲明在那些元素之前。

ElementType.TYPE:說明該注解只能被聲明在一個類前。

ElementType.FIELD:說明該注解只能被聲明在一個類的字段前。

ElementType.METHOD:說明該注解只能被聲明在一個類的方法前。

ElementType.PARAMETER:說明該注解只能被聲明在一個方法參數前。

ElementType.CONSTRUCTOR:說明該注解只能聲明在一個類的構造方法前。

ElementType.LOCAL_VARIABLE:說明該注解只能聲明在一個局部變量前。

ElementType.ANNOTATION_TYPE:說明該注解只能聲明在一個注解類型前。

ElementType.PACKAGE:說明該注解只能聲明在一個包名前

@Constraint 通過使用validatedBy來指定與注解關聯的驗證器

@Retention 用來說明該注解類的生命周期。

RetentionPolicy.SOURCE: 注解只保留在源文件中 

RetentionPolicy.CLASS : 注解保留在class文件中,在加載到JVM虛擬機時丟棄

RetentionPolicy.RUNTIME: 注解保留在程序運行期間,此時可以通過反射獲得定義在某個類上的所有注解。

驗證器類

驗證器類需要實現ConstraintValidator泛型接口 

  1. public class ParamConstraintValidated implements ConstraintValidator<Check, Object> {  
  2.     /**  
  3.      * 合法的參數值,從注解中獲取  
  4.      * */  
  5.     private List<String> paramValues;  
  6.     @Override  
  7.     public void initialize(Check constraintAnnotation) {  
  8.         //初始化時獲取注解上的值  
  9.         paramValues = Arrays.asList(constraintAnnotation.paramValues());  
  10.     }  
  11.     public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {  
  12.         if (paramValues.contains(o)) {  
  13.             return true;  
  14.         }  
  15.         //不在指定的參數列表中  
  16.         return false;  
  17.     }  

第一個泛型參數類型Check:注解,第二個泛型參數Object:校驗字段類型。需要實現initialize和isValid方法,isValid方法為校驗邏輯,initialize方法初始化工作

使用方式

定義一個實體類 

  1. @Data  
  2. public class User {  
  3.     /**  
  4.      * 姓名  
  5.      * */  
  6.     private String name;  
  7.     /**  
  8.      * 性別 man or women  
  9.      * */  
  10.     @Check(paramValues = {"man", "woman"})  
  11.     private String sex;  

對sex字段加校驗,其值必須為woman或者man

測試 

  1. @RestController("/api/test")  
  2. public class TestController {  
  3.     @PostMapping  
  4.     public Object test(@Validated @RequestBody User user) {  
  5.         return "hello world";  
  6.     }  

注意需要在User對象上加上@Validated注解,這里也可以使用@Valid注解

方法、類注解

在開發過程中遇到過這樣的需求,如只有有權限的用戶的才能訪問這個類中的方法或某個具體的方法、查找數據的時候先不從數據庫查找,先從guava cache中查找,在從redis查找,最后查找mysql(多級緩存)。

這時候我們可以自定義注解去完成這個要求,第一個場景就是定義一個權限校驗的注解,第二個場景就是定義spring-data-redis包下類似@Cacheable的注解。

權限注解

自定義注解 

  1. @Target({ ElementType.METHOD, ElementType.TYPE})  
  2. @Retention(RetentionPolicy.RUNTIME)  
  3. public @interface PermissionCheck { 
  4.     /**  
  5.      * 資源key  
  6.      * */ 
  7.     String resourceKey();  

該注解的作用范圍為類或者方法上

攔截器類 

  1. public class PermissionCheckInterceptor extends HandlerInterceptorAdapter {  
  2.     /**  
  3.      * 處理器處理之前調用  
  4.      */  
  5.     @Override  
  6.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response,  
  7.                              Object handler) throws Exception { 
  8.          HandlerMethod handlerMethod = (HandlerMethod)handler;  
  9.         PermissionCheck permission = findPermissionCheck(handlerMethod);  
  10.         //如果沒有添加權限注解則直接跳過允許訪問  
  11.         if (permission == null) {  
  12.             return true;  
  13.         }  
  14.         //獲取注解中的值  
  15.         String resourceKey = permission.resourceKey();  
  16.         //TODO 權限校驗一般需要獲取用戶信息,通過查詢數據庫進行權限校驗  
  17.         //TODO 這里只進行簡單演示,如果resourceKey為testKey則校驗通過,否則不通過  
  18.         if ("testKey".equals(resourceKey)) {  
  19.             return true;  
  20.         }  
  21.         return false;  
  22.     }  
  23.     /**  
  24.      * 根據handlerMethod返回注解信息  
  25.      *  
  26.      * @param handlerMethod 方法對象  
  27.      * @return PermissionCheck注解  
  28.      */  
  29.     private PermissionCheck findPermissionCheck(HandlerMethod handlerMethod) { 
  30.         //在方法上尋找注解  
  31.         PermissionCheck permission = handlerMethod.getMethodAnnotation(PermissionCheck.class);  
  32.         if (permission == null) {  
  33.             //在類上尋找注解  
  34.             permission = handlerMethod.getBeanType().getAnnotation(PermissionCheck.class);  
  35.         }  
  36.         return permission;  
  37.     }  

權限校驗的邏輯就是你有權限你就可以訪問,沒有就不允許訪問,本質其實就是一個攔截器。我們首先需要拿到注解,然后獲取注解上的字段進行校驗,校驗通過返回true,否則返回false

測試 

  1. @GetMapping("/api/test")  
  2.  @PermissionCheck(resourceKey = "test" 
  3.  public Object testPermissionCheck() {  
  4.      return "hello world";  
  5.  } 

該方法需要進行權限校驗所以添加了PermissionCheck注解。

緩存注解

自定義注解 

  1. @Target({ ElementType.METHOD, ElementType.TYPE})  
  2. @Retention(RetentionPolicy.RUNTIME)  
  3. public @interface CustomCache {  
  4.     /**  
  5.      * 緩存的key值  
  6.      * */  
  7.     String key();  

注解可以用在方法或類上,但是緩存注解一般是使用在方法上的。

切面 

  1. @Aspect  
  2. @Component  
  3. public class CustomCacheAspect {  
  4.     /**  
  5.      * 在方法執行之前對注解進行處理  
  6.      *  
  7.      * @param pjd  
  8.      * @param customCache 注解  
  9.      * @return 返回中的值  
  10.      * */  
  11.     @Around("@annotation(com.cqupt.annotation.CustomCache) && @annotation(customCache)")  
  12.     public Object dealProcess(ProceedingJoinPoint pjd, CustomCache customCache) {  
  13.         Object result = null 
  14.         if (customCache.key() == null) {  
  15.             //TODO throw error  
  16.         }  
  17.         //TODO 業務場景會比這個復雜的多,會涉及參數的解析如key可能是#{id}這些,數據查詢  
  18.         //TODO 這里做簡單演示,如果key為testKey則返回hello world  
  19.         if ("testKey".equals(customCache.key())) {  
  20.             return "hello word";  
  21.         }   
  22.         //執行目標方法  
  23.         try {  
  24.             result = pjd.proceed();  
  25.         } catch (Throwable throwable) {  
  26.             throwable.printStackTrace();  
  27.         }  
  28.         return result;  
  29.     }  

因為緩存注解需要在方法執行之前有返回值,所以沒有通過攔截器處理這個注解,而是通過使用切面在執行方法之前對注解進行處理。

如果注解沒有返回值,將會返回方法中的值

測試 

  1. @GetMapping("/api/cache")  
  2. @CustomCache(key = "test" 
  3. public Object testCustomCache() {  
  4.     return "don't hit cache";  
  5.  

 

責任編輯:龐桂玉 來源: 民工哥技術之路
相關推薦

2024-10-14 17:18:27

2017-08-03 17:00:54

Springmvc任務執行器

2011-12-26 10:11:08

JSP

2023-10-11 07:57:23

springboot微服務

2023-10-24 13:48:50

自定義注解舉值驗證

2021-12-07 18:23:50

自定義進度條分段式

2020-11-12 08:41:35

Linux系統

2023-10-23 08:18:50

掃描SpringBean

2024-12-27 15:37:23

2021-12-30 12:30:01

Java注解編譯器

2021-05-19 08:20:59

ViewGrouplayout作用

2022-11-10 07:53:54

Spring參數校驗

2022-02-17 07:10:39

Nest自定義注解

2024-07-02 11:42:53

SpringRedis自定義

2022-11-01 11:15:56

接口策略模式

2021-02-20 11:40:35

SpringBoot占位符開發技術

2024-10-09 10:46:41

springboot緩存redis

2023-09-04 15:06:18

Pytorch靜態量化動態量化

2009-08-10 14:16:59

ASP.NET自定義控

2023-10-09 07:37:01

點贊
收藏

51CTO技術棧公眾號

波多野结衣精品| 天天操天天插天天射| 欧美国产专区| 亚洲精品久久久久国产| 亚洲熟妇av一区二区三区| 国产一级免费在线观看| 精品一区二区免费看| 欧美高清激情视频| www.av天天| 一区二区三区国产好| 91黄色免费观看| 米仓穗香在线观看| 久久免费看视频| 国产乱码字幕精品高清av| 国产91av在线| 欧美成人片在线观看| 国产精品美女久久久久久不卡| 欧美精品久久99| 国内外成人激情视频| caoporn97在线视频| 久久久三级国产网站| 99高清视频有精品视频| 日韩国产成人在线| 一区二区三区成人精品| 欧美成人免费网| 亚洲色图欧美色| 牛牛影视一区二区三区免费看| 欧美电影一区二区| 韩国一区二区av| 91cn在线观看| 中文字幕在线不卡| 欧美日本亚洲| 日韩永久免费视频| 国产精品 日产精品 欧美精品| 国产精品久久久久久久久借妻| 日产精品久久久久| 欧美激情日韩| 久久久av一区| 色偷偷www8888| 日韩国产一区二区三区| 亚洲欧美综合v| 中文字幕无码人妻少妇免费| 美国十次综合久久| 欧美日韩国产在线观看| 搡女人真爽免费午夜网站| 自拍偷拍欧美视频| 红桃av永久久久| 日本www在线视频| 欧美人与动牲性行为| 亚洲免费av高清| 中文字幕中文字幕一区三区| 在线视频1区2区| 国产欧美日韩三级| 五月天色一区| 男人资源在线播放| 中文字幕一区日韩精品欧美| 一区二区国产日产| 麻豆网站在线看| 亚洲美女精品一区| 精品免费久久久久久久| 免费在线国产视频| 亚洲一区欧美一区| 国产va亚洲va在线va| 成人免费网站观看| 欧美日韩亚洲天堂| 国产乱子夫妻xx黑人xyx真爽 | aaa欧美日韩| 国产日韩欧美一区二区三区四区| 天天干天天插天天操| 97国产一区二区| 奇米视频888战线精品播放| 你懂的视频在线| 中文字幕av一区二区三区高 | 成人激情视频在线| 国产伦子伦对白视频| 国产精品一区免费视频| 成人自拍网站| 日产精品久久久久久久性色| 国产视频不卡一区| 亚洲 欧洲 日韩| 9999在线视频| 日本精品免费观看高清观看| 欧美视频国产视频| 黑人久久a级毛片免费观看| 日韩电影大片中文字幕| 69视频在线观看免费| 99久久国产综合精品成人影院| 欧美xxxx做受欧美.88| 日韩免费一二三区| 日韩国产精品大片| 国产成人女人毛片视频在线| 欧美孕妇孕交| 18涩涩午夜精品.www| 无码专区aaaaaa免费视频| 欧美男体视频| 日韩欧美一区二区在线视频| 欧美做受喷浆在线观看| 欧美3p视频| 97超碰蝌蚪网人人做人人爽| 中文字幕一区2区3区| 国产成人av电影在线播放| 欧美日韩一区二| 色女人在线视频| 色婷婷亚洲一区二区三区| 女王人厕视频2ⅴk| 国产欧美日韩| 久久久亚洲精品视频| 一级全黄裸体免费视频| av一本久道久久综合久久鬼色| 一区视频二区视频| 免费v片在线观看| 91精品午夜视频| 亚欧洲乱码视频| 欧美~级网站不卡| 国产精品91在线| 韩国av免费在线| 亚洲欧洲日韩在线| 激情五月亚洲色图| 国产精品乱战久久久| 久久精品视频网站| 蜜臀99久久精品久久久久小说| 成人毛片视频在线观看| 一区二区视频在线观看| 亚洲第一影院| 日韩av影院在线观看| 麻豆视频在线观看| 激情五月激情综合网| 欧美国产二区| 98色花堂精品视频在线观看| 日韩亚洲欧美一区| 精品日韩在线视频| 欧美亚洲专区| 精品国产一区二区三区四区精华| 日韩精品卡一| 日韩欧美黄色影院| 91嫩草|国产丨精品入口| 免费成人小视频| 欧美人xxxxx| 欧美无毛视频| 亚洲美女久久久| 国产精品第5页| 久久夜色精品国产噜噜av| 91九色丨porny丨国产jk| 91成人在线精品视频| 久久99国产综合精品女同| 一级欧美一级日韩| 亚洲视频一区二区在线观看| 色噜噜狠狠一区二区| 日韩不卡一区| 成人一区二区电影| а√中文在线8| 日韩无一区二区| 加勒比av在线播放| 成人午夜看片网址| 亚洲美免无码中文字幕在线| 精品成人自拍视频| 88xx成人精品| 黄色av网站在线免费观看| 色婷婷一区二区三区四区| 亚洲国产av一区| 老司机免费视频一区二区三区| 亚洲国产精品一区二区第一页 | 日韩午夜高潮| 精品视频高清无人区区二区三区| 日本不卡免费高清视频在线| 亚洲男人天堂视频| 中文字幕视频在线播放| 亚洲免费观看视频| 亚洲黄色免费在线观看| 久久久久国产一区二区| 少妇免费毛片久久久久久久久| 另类一区二区| 欧美寡妇偷汉性猛交| 午夜18视频在线观看| 在线精品国精品国产尤物884a| 国产黄色片在线| 国产成人午夜99999| 久久综合色视频| 国产一区二区观看| 成人国产精品日本在线| 1区2区3区在线| 国产亚洲精品久久久优势| 国产免费高清视频| 精品久久中文字幕久久av| 精品无码在线观看| 国产99久久久国产精品潘金| 国产精品亚洲二区在线观看| 欧美激情777| 99精彩视频| 性欧美hd调教| 欧美黑人性视频| 二区三区在线| 精品国产乱码久久| 中文字幕视频二区| 亚洲一区中文在线| 亚洲第一视频区| 成人激情av网| 国产成人美女视频| 亚洲欧美成人| 精品91一区二区三区| 亚洲另类av| http;//www.99re视频| 欧美日韩国产网站| 久久频这里精品99香蕉| 欧美私人网站| 亚洲男人第一网站| 成人午夜精品福利免费| 欧美精品色综合| 无码人妻精品一区二区蜜桃色欲| 一区二区三区成人在线视频| 国产一二三四区在线| caoporn国产一区二区| 欧美日韩精品区别| 视频一区二区欧美| 国模无码视频一区二区三区| 欧美一区二区三区久久精品| 亚洲精品欧美精品| 在线一级成人| 国模一区二区三区私拍视频| 久久视频社区| 国产精品视频男人的天堂| 末成年女av片一区二区下载| 麻豆一区二区在线观看| av色图一区| 亚洲色图五月天| 午夜性色福利视频| 亚洲国产日韩欧美在线图片 | 精品亚洲国产成av人片传媒| 精品国产99久久久久久宅男i | 亚洲国产成人精品一区二区三区| 欧美日韩国产高清一区二区三区| 日日夜夜狠狠操| 欧美色视频日本版| 看片网址国产福利av中文字幕| 亚洲激情在线播放| 国产美女久久久久久| 国产精品国产三级国产a| 精品人伦一区二区三电影| 久久这里只有精品视频网| 中国极品少妇videossexhd | 国产一区在线免费| 97青娱国产盛宴精品视频| 99免费在线观看视频| 清纯唯美激情亚洲| 成人自拍偷拍| 欧美日韩一区二区三区四区不卡| 国产一区二区高清不卡| 精品福利一区| 精品一区在线播放| 亚洲人成网亚洲欧洲无码| 欧美日韩国产综合在线| 欧美男gay| 亚洲国产一区二区三区在线| 精品久久久久久久久久久下田 | 91久久爱成人| 网站一区二区| 国产一区在线免费| 蜜臀av免费一区二区三区| 日韩av电影免费播放| 国产亚洲一区二区三区不卡| 日韩影视精品| 99久久婷婷国产综合精品电影√| 五月天男人天堂| 好看的av在线不卡观看| 免费看一级大黄情大片| 日日夜夜一区二区| 欧美日韩久久婷婷| 成人午夜免费av| 国产精品成人一区二区三区电影毛片| 国产午夜精品一区二区| 日日操免费视频| 一区二区三区 在线观看视频| 在线免费观看毛片| 91精品福利视频| 91丨porny丨在线中文 | 国产精品草莓在线免费观看| 欧美aaaaaa| 国产精品免费一区二区| 免费视频一区三区| 亚洲午夜在线观看| 国产精品啊啊啊| 国产成人无码av在线播放dvd| 精品一区二区三区av| 国产精品久久电影观看| 一女三黑人理论片在线| 久久91精品国产91久久小草| 熟妇无码乱子成人精品| eeuss国产一区二区三区| 一级在线观看视频| 一区二区视频免费在线观看| 国产成人免费看| 91精品视频网| 美女欧美视频在线观看免费| 久久天天躁狠狠躁老女人| 成人ssswww在线播放| 国产人妖伪娘一区91| 欧美精品密入口播放| 一本一道久久久a久久久精品91| 樱桃成人精品视频在线播放| 美女网站色免费| 91丨porny丨在线| 日本天堂中文字幕| 在线中文字幕一区| 四虎免费在线观看| zzijzzij亚洲日本成熟少妇| 欧洲亚洲两性| 国产高清不卡av| 久久久久久久久99精品大| 国产成人久久婷婷精品流白浆| 国产成人精品免费在线| 在线看片中文字幕| 日韩欧美国产成人| 亚洲国产综合一区| 精品国内自产拍在线观看| 日韩理论视频| 国产精品免费看一区二区三区| 外国成人免费视频| 午夜免费一区二区| 久久综合狠狠综合| 日本一级黄色录像| 欧美一级国产精品| 午夜小视频在线| 国产精品久久久久久网站| 三级小说欧洲区亚洲区| 轻点好疼好大好爽视频| 国产尤物一区二区| 九一在线免费观看| 在线观看中文字幕不卡| 深夜福利在线视频| 久久久久久久久国产精品| 亚洲1区在线| 91精品一区二区三区四区| 九九精品视频在线看| 日韩女同一区二区三区 | 亚洲 自拍 另类小说综合图区| 国产综合色在线视频区| 手机av在线不卡| 精品视频123区在线观看| 北岛玲一区二区三区| 日韩免费观看网站| 久久av中文| 国产一区视频免费观看| 久久免费偷拍视频| 亚洲欧美一二三区| 亚洲乱码一区av黑人高潮| 国产美女精品写真福利视频| 国产一区二区久久久| 在线日韩中文| 亚洲の无码国产の无码步美| 午夜电影一区二区| 神马亚洲视频| 国产精品海角社区在线观看| 国产伦一区二区三区| 自拍偷拍 国产| 国产精品国产馆在线真实露脸| 136福利视频导航| 久久亚洲精品国产亚洲老地址| 国产一区二区在线观| 老司机激情视频| hitomi一区二区三区精品| 中文字幕精品三级久久久| 亚洲男人天堂2019| 福利一区二区三区视频在线观看| 亚洲欧洲精品一区二区三区波多野1战4| 美女视频第一区二区三区免费观看网站| 很污很黄的网站| 欧美一区二区大片| 国产自产自拍视频在线观看| 欧美xxxx黑人又粗又长密月| 日韩电影在线免费看| а天堂中文在线资源| 欧美一区二区啪啪| 18aaaa精品欧美大片h| 蜜桃av久久久亚洲精品| 久久激五月天综合精品| 久久机热这里只有精品| 日韩精品高清在线观看| 99精品在免费线偷拍| 玖玖精品在线视频| 99久久久国产精品免费蜜臀| 精品黑人一区二区三区| 久久天天躁狠狠躁夜夜躁2014| av成人资源| 久久综合伊人77777麻豆最新章节| 最新日韩av在线| 欧美 日韩 国产 成人 在线| 国产精品爱久久久久久久| 影音先锋日韩精品| av在线网站观看| 欧美一级xxx| 精品3atv在线视频| 法国空姐在线观看免费| 26uuu久久综合| 国产成人精品亚洲精品色欲| 青草热久免费精品视频| 亚欧美无遮挡hd高清在线视频| 玖草视频在线观看| 欧美一二三四区在线| 日韩欧美看国产| 黄色一级片国产|