精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美老熟妇喷水| 豆国产97在线| 中文字幕伦理片| 99re8精品视频在线观看| 亚洲日本一区二区| 精品国产一区二区三区麻豆小说| 国产又粗又猛又黄视频| 欧美电影一区| 亚洲精品电影网| 中文字幕亚洲欧洲| 大香伊人中文字幕精品| 国产三区在线成人av| 亚洲a区在线视频| 伊人手机在线视频| 五月婷婷六月综合| 精品一区二区三区四区| 一区二区久久精品| 成人一区福利| 伊人性伊人情综合网| 日本一区视频在线观看| 国产自产一区二区| 麻豆免费精品视频| 2019中文字幕在线| 黄色一级片在线免费观看| 狠狠色狠狠色综合婷婷tag| 精品国产免费一区二区三区四区 | 在线观看一区| 日韩在线视频国产| 在线观看福利片| 成人h动漫精品一区二区器材| 欧美日精品一区视频| 国产午夜福利视频在线观看| www红色一片_亚洲成a人片在线观看_| 久久综合色婷婷| 国产精品三区在线| 一级日本黄色片| 欧美天堂视频| 欧美日韩另类字幕中文| 人人妻人人澡人人爽欧美一区双 | 久久精品在这里| 国产成人精品免费视频大全最热 | 亚洲高清久久网| xxx中文字幕| 欧美日韩卡一| 91黄视频在线| 北条麻妃av高潮尖叫在线观看| 超碰97免费在线| 一区二区三区高清| 天堂а√在线中文在线| a视频在线观看| 亚洲欧洲av色图| 亚洲国产精品www| 成人高清免费在线播放| 国产日韩欧美一区二区三区乱码 | 91视频在线观看| 国产午夜精品在线观看| 欧美人xxxxx| 你懂的在线网址| 久久欧美肥婆一二区| 97视频免费在线看| 久久一区二区三区视频| 国产亚洲网站| 日韩美女在线观看一区| 中文字幕精品无| 青青草成人在线观看| 国产精品久久二区| 一级特黄aa大片| 国产一区二区三区四区五区入口 | 欧美一区 二区| 日韩成人在线视频观看| 日本aaa视频| 精品视频久久| 久久中文字幕国产| 久久久久香蕉视频| 亚洲免费网址| 亚洲一区二区三区四区中文字幕| 欧美日韩国产激情| 精品日韩欧美| 国产理论电影在线观看| 97久久视频| 久久躁狠狠躁夜夜爽| 久久综合成人网| 亚洲综合好骚| 成人激情电影一区二区| 亚洲精品久久久久久久久久久久久久 | 国产一区二区在线播放视频| 国内久久精品视频| 不卡一卡2卡3卡4卡精品在| 黄色片一区二区| 久久久噜噜噜久久中文字幕色伊伊 | 肉色超薄丝袜脚交| 豆花视频一区二区| 在线日韩欧美视频| 久久久国产精品黄毛片| 性高湖久久久久久久久| 国产在线一区二区三区| 好吊色在线观看| 国产日韩av一区二区| 可以免费看的黄色网址| 中文字幕这里只有精品| 欧美久久久久免费| 日本免费福利视频| 久久精品国内一区二区三区水蜜桃| 九九精品在线视频| 亚洲国产精品无码久久久| 国产激情视频一区二区在线观看| 久久综合久久综合这里只有精品| 黄网站在线免费| 精品国产精品自拍| 欧美人与性动交α欧美精品| 国产一区日韩| 性色av一区二区三区红粉影视| 中国女人一级一次看片| www.亚洲精品| 妞干网这里只有精品| 亚洲成人不卡| 亚洲韩国日本中文字幕| 91久久国产综合| 日韩av网站在线观看| 国偷自产av一区二区三区小尤奈| 成人日韩欧美| 在线观看三级视频欧美| 精品国产无码在线| 校园春色亚洲色图| 日韩精品视频在线| 久久人人爽人人爽人人| 久久精品国产精品青草| 日本成人三级| 九色porny丨首页入口在线| 日韩一区二区精品葵司在线| 一本在线免费视频| 日韩精品色哟哟| 农村寡妇一区二区三区| 国产极品在线观看| 精品国产乱码久久久久久1区2区| 国产一区二区播放| 久久99精品一区二区三区| 色噜噜一区二区| 日日av拍夜夜添久久免费| 日韩精品黄色网| 日产电影一区二区三区| 成人动漫在线一区| 国产精品久久久久7777| 91精品短视频| 欧美激情一区二区三区成人 | 天天干天天色天天爽| 国产成人免费精品| 最近2019中文免费高清视频观看www99| 亚洲自拍一区在线观看| 国产视频一区在线播放| 久久午夜夜伦鲁鲁一区二区| 亚洲精品合集| 欧美一级大片在线免费观看| 天堂√在线中文官网在线| 欧美日韩国产精品专区| 美女久久久久久久久久| 免费在线成人| 日本10禁啪啪无遮挡免费一区二区 | 国产精欧美一区二区三区白种人| 久久久综合色| 91中文字幕在线| 男女在线观看视频| 精品国产乱码久久久久久老虎| 国产无套粉嫩白浆内谢| 97超碰欧美中文字幕| 男人天堂999| 日韩电影免费网址| 91嫩草在线| 理论不卡电影大全神| 亚洲免费影视第一页| 正在播放亚洲精品| 一区二区三区鲁丝不卡| 精品无码在线视频| 热久久一区二区| 日韩视频 中文字幕| 另类在线视频| 国产精品美女主播在线观看纯欲| 精品视频在线一区二区| 欧美成人在线直播| 日韩在线播放中文字幕| 成人欧美一区二区三区1314| 又色又爽又黄18网站| 国产欧美亚洲精品a| 国产精品亚洲美女av网站| 国产黄大片在线观看画质优化| 亚洲精品一区二区三区蜜桃下载 | 伊人久久婷婷色综合98网| 综合欧美亚洲| 国产精品 欧美在线| 免费大片在线观看www| 亚洲国产精久久久久久| 中文字幕日韩三级| 亚洲成人一区在线| 日本不卡一区视频| 99免费精品视频| 做a视频在线观看| 亚洲少妇一区| 午夜啪啪免费视频| 九色精品91| 91久久爱成人| 99久久精品一区二区成人| 欧美高清不卡在线| 午夜伦全在线观看| 国产丝袜一区视频在线观看| 99产精品成人啪免费网站| 色综合天天综合给合国产| 欧美爱爱免费视频| 日本一区二区视频在线| 东京热av一区| 狠狠色丁香九九婷婷综合五月| 日韩av片在线看| 国产伊人精品| 中文精品视频一区二区在线观看| 蜜臀久久99精品久久一区二区| 7777精品久久久大香线蕉小说| 综合在线影院| 97色在线观看| av在线不卡免费| 日韩综合视频在线观看| 国产专区在线播放| 亚洲精品美女久久| 亚洲精品一区二区三区蜜桃 | 日韩在线不卡一区| 久久久久久久欧美精品| 霍思燕三级露全乳照| 欧美精品观看| 日韩中文在线字幕| 97精品一区| 午夜啪啪免费视频| 日韩免费特黄一二三区| 日韩高清国产精品| 久久av影视| 欧美一区二区三区四区在线观看地址 | 中文字幕一区二区三区有限公司| 久久综合影院| 欧美亚洲免费在线| 综合色就爱涩涩涩综合婷婷| 久久艹中文字幕| 全球av集中精品导航福利| 国产精品污www一区二区三区| 欧美成年网站| 成人免费看片网址| 99re6热只有精品免费观看| 成人在线免费网站| 97超碰成人| 国产一区二区在线网站| 精品日产乱码久久久久久仙踪林| 91在线免费看片| 视频欧美一区| 国产伦精品一区二区三区免费视频 | 在线日本视频| 日韩在线视频免费观看| 欧洲日本在线| 欧美另类精品xxxx孕妇| 日本伦理一区二区| 久久免费精品日本久久中文字幕| а√在线天堂官网| 欧美专区在线播放| 成人精品电影在线| 91精品美女在线| 欧美2区3区4区| 极品日韩久久| 久久最新网址| 超碰成人在线免费观看| 午夜日本精品| 国产91在线免费| 日韩不卡一二三区| 成人亚洲免费视频| 粉嫩av一区二区三区在线播放| 在线精品一区二区三区| 国产无一区二区| 久久爱一区二区| 亚洲午夜久久久久久久久电影网 | 都市激情国产精品| 国产精品第1页| vam成人资源在线观看| 翡翠波斯猫1977年美国| 亚洲精品白浆高清| 中文字幕一区二区三区最新| 在线精品在线| 啊啊啊国产视频| 国产成人免费视频一区| 人妻丰满熟妇aⅴ无码| 亚洲欧洲美洲综合色网| 日本在线小视频| 欧美视频三区在线播放| www.黄色片| 国产亚洲一区精品| 午夜成年人在线免费视频| 欧日韩在线观看| 99久久这里有精品| 鲁丝一区鲁丝二区鲁丝三区| 成人综合专区| 黄色国产一级视频| 极品美女销魂一区二区三区| 一区二区三区少妇| 亚洲精选视频免费看| 日韩在线播放中文字幕| 日韩免费在线观看| 91精品专区| 国语对白做受69| 亚洲一区二区av| 蜜桃视频在线观看成人| 欧美精品大片| 污污网站免费观看| 2017欧美狠狠色| 看片网站在线观看| 欧美日韩一区二区不卡| 午夜国产在线视频| 欧美日韩国产999| 国产成人精选| 欧美一区二区综合| 日韩天堂av| 在线观看一区二区三区视频| 中国av一区二区三区| 久久久久久久久久久影院| 日韩精品一区二区三区swag | 人妻视频一区二区三区| 久久久999精品视频| 日韩欧美一区二区三区免费观看 | 五月激情六月综合| 亚洲AV无码成人片在线观看| 最近2019中文字幕在线高清| 在线免费三级电影网站| 国产视频精品网| 欧美日韩日本国产亚洲在线| 精品综合久久久久| 欧美激情一区二区三区蜜桃视频| 久久午夜免费视频| 亚洲成人av在线| 男人天堂亚洲天堂| 国产99在线免费| 国产在线不卡| 国产无套精品一区二区三区| ...av二区三区久久精品| 精品国产www| 最新国产成人av网站网址麻豆| 色综合一本到久久亚洲91| 免费av在线一区二区| 国产精品久久久一区二区| 亚洲精品乱码久久久久久久| 亚洲大片免费看| 天堂网在线播放| 69影院欧美专区视频| 国产乱论精品| 成人中文字幕在线播放| 91色在线porny| 一区二区三区在线观看av| 亚洲三级av在线| 色8久久影院午夜场| 日韩欧美一区二区在线观看| 日本免费新一区视频| 女人黄色一级片| 欧美卡1卡2卡| 香蕉成人app免费看片| 91免费看蜜桃| 在线午夜精品| 中文字幕国产专区| 欧美日韩免费不卡视频一区二区三区| aⅴ在线视频男人的天堂| 国产专区欧美专区| 欧美.日韩.国产.一区.二区| 18深夜在线观看免费视频| 一区二区三区欧美亚洲| 婷婷视频在线观看| 日韩69视频在线观看| 日韩理论电影大全| 成人高清在线观看视频| 香蕉加勒比综合久久| 欧美zzoo| 91在线观看免费观看| 亚洲人成久久| 国产亚洲精品熟女国产成人| 欧美日本一区二区三区四区| 调教一区二区| 久久艳妇乳肉豪妇荡乳av| 日韩电影在线一区二区三区| 国产午夜精品理论片| 日韩高清有码在线| 美女色狠狠久久| 久久国产精品免费观看| 91蜜桃在线免费视频| 97超视频在线观看| 91chinesevideo永久地址| 久久一区二区三区电影| 亚洲欧洲国产视频| 色成年激情久久综合| av黄在线观看| 青青草国产精品| 国产成人精品影视| 中文字幕乱码视频| 午夜精品久久久久久久男人的天堂 | 成人高清免费观看| 五月激情丁香网| 久久久久久久香蕉网| 日韩极品一区| 中文精品在线观看| 91精品国产色综合久久不卡电影| 午夜影院在线播放| 美女在线免费视频|