天天看點

Spring 自定義注解

字段注解

字段注解一般是用于校驗字段是否滿足要求,hibernate-validate依賴就提供了很多校驗注解 ,如@NotNull、@Range等,但是這些注解并不是能夠滿足所有業務場景的。比如我們希望傳入的參數在指定的String集合中,那麼已有的注解就不能滿足需求了,需要自己實作。

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

@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泛型接口

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

定義一個實體類

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

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

方法、類注解

在開發過程中遇到過這樣的需求,如隻有有權限的使用者的才能通路這個類中的方法或某個具體的方法、查找資料的時候先不從資料庫查找,先從guava cache中查找,在從redis查找,最後查找mysql(多級緩存)。

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

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

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

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

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

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

小結

本篇文章主要介紹了開發過程中遇到自定義注解的場景以及自定義注解實作。如有纰漏,歡迎指正。