日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring注解编程基石(一)

發布時間:2024/4/13 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring注解编程基石(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

Java注解

Java原生注解

元注解

Stereotype 注解

組合注解

組合注解實現的基礎 @AliasFor

隱式別名

@AliasFor 和 @Inherited 區別

注解解析工具

解析流程

AnnotationUtils

元注解支持

屬性別名

搜索范圍

AnnotatedElementUtils

查找與獲取語義

支持 @Inherited

源碼分析

解析流程

輔助類

AnnotationFilter

MergedAnnotation接口

MergedAnnotations接口

TypeMappedAnnotations

AnnotationsScannerMergedAnnotationSelectorAnnotationTypeMappingAnnotationTypeMappingsAnnotationTypeMapping幫助理解示例

AnnotationUtils 源碼分析

AnnotatedElementUtils 源碼分析


Spring注解編程基石(一)

Spring注解編程基石(二)

Spring注解編程基石(三)

Spring注解編程基石(四)


Java注解

Java原生注解

Java注解基礎

注解的屬性也叫做成員變量,注解只有成員變量,沒有方法。注解的成員變量在注解的定義中以“無形參的方法”形式來聲明,其方法名定義了該成員變量的名字,其返回值定義了該成員變量的類型。

元注解

元注解是一種標注在別的注解之上的注解。如果一個注解可以標注在別的注解上,那么這個注解已然是元注解。

@Target值為TYPE

Stereotype 注解

可理解為模式化注解、角色類注解。例如:@Repository,@Component,@Service,@Bean等。

組合注解

組合注解是一種被一個或者多個元注解標注過的注解,用以撮合多個元注解的特性到新的注解。例如@SpringBootApplication

組合注解實現的基礎 @AliasFor

@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Documented public @interface AliasFor {@AliasFor("attribute")String value() default "";@AliasFor("value")String attribute() default "";//需要覆蓋的注解類型。同一注解內部可以省略 annotation 屬性Class<? extends Annotation> annotation() default Annotation.class; }

@AliasFor 將注解的一個成員名(Attribute Alias)變為另一個。成員別名可以分為以下幾種。

  • Explicit Aliases(顯式別名)

如果一個注解中的兩個成員通過 @AliasFor聲明后互為別名,那么它們是明確的別名。顯示別名必須成對出現。

  • Implicit Aliases(隱式別名)

如果一個注解中的兩個或者更多成員通過 @AliasFor 聲明去覆蓋同一個元注解的成員值,它們就是隱含別名。

  • Transitive Implicit Aliases(傳遞的隱式別名)

如果一個注解中的兩個或者更多成員通過 @AliasFor 聲明去覆蓋元注解中的不同成員,但是實際上因為覆蓋的傳遞性導致最終覆蓋的是元注解中的同一個成員,那么它們就是可傳遞的隱含別名。

注意:使用 @AliasFor 標注的有以下限制:一是屬性都必須都有默認值且相等;二是屬性的返回值類型也必須相等;三是屬性雙方都必須指定別名,且不能沖突。

隱式別名

使用元注解隱式別名,必須在注解上顯示應用元注解。例如@SpringBootApplication? 注解 覆蓋?@SpringBootConfiguration,@EnableAutoConfiguration,@ComponentScan

@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = {@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class} ), @Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication {@AliasFor(annotation = EnableAutoConfiguration.class)Class<?>[] exclude() default {};@AliasFor(annotation = EnableAutoConfiguration.class)String[] excludeName() default {};@AliasFor(annotation = ComponentScan.class,attribute = "basePackages")String[] scanBasePackages() default {};@AliasFor(annotation = ComponentScan.class,attribute = "basePackageClasses")Class<?>[] scanBasePackageClasses() default {}; }

@AliasFor 和 @Inherited 區別

@Inherited 元注解表示被@Inherited標注過的注解,應用在class上時,可以被?class 的子類所繼承。 但注意:一是類并不從它所實現的接口繼承;二是方法并不從它所重載的方法繼承。?

@AliasFor 和 @Inherited 區別:

  • @Inherited 強調子類可以繼承父類的注解信息(不能獲取接口上的注解信息)。
  • @AliasFor 通過別名機制更強調兩個注解的關系,類似 java 中類的繼承。

例如?Spring 中 @Controller、@Repository、@Service 都是基于 @Component 派發出了一系列的注解,但語義更強。

注解解析工具

ava 運行時讀取Annotation 需要通過反射,Spring 提供AnnotationUtils AnnotationElementUtils 用于簡化操作

  • AnnotationUtils?解決注解別名,包括顯示別名、隱式別名、傳遞的隱式別名。還可以查的指定注解的屬性信息,但不能解決元注解屬性覆蓋的問題。
  • AnnotatedElementUtils?為 Spring 的元注解編程模型定義了公共 API,并支持注解屬性覆蓋。如果不需要支持注解屬性覆蓋,請考慮使用 AnnotationUtils

解析流程

?

AnnotationUtils

用于處理注解,元注解,橋接方法(編譯器為通用聲明生成)以及超級方法(用于可選注解繼承)的常規實用程序方法。請注意,JDK 的內省工具本身并不提供此類的大多數功能。

  • getAnnotations(Method, Class) 在給定類級別查找
  • findAnnotation(Method, Class) 給定方法的整個繼承層次結構中的查找查找

元注解支持

大多數 find() 方法和此類中的一些 get() 方法都支持查找用作元注解的注解。

屬性別名

此類中返回注解,注解數組或 AnnotationAttributes 的所有公共方法都透明地支持通過 @AliasFor 配置的屬性別名。

搜索范圍

一旦找到指定類型的第一個注解,此類中的方法使用的搜索算法將停止搜索注解。因此,將默默忽略指定類型的其他注解。

AnnotatedElementUtils

用于在 AnnotatedElements上查找注解,元注解和可重復注解的常規實用程序方法。 AnnotatedElementUtils 為 Spring 的元注解編程模型定義了公共 API,并支持注解屬性覆蓋。注意:如果屬性沒有顯示賦值,默認值不會覆蓋@AliasFor的屬性值。

查找與獲取語義

獲取語??義(Get semantics)僅限于搜索 AnnotatedElement 上存在的注解(即本地聲明或繼承)或在 AnnotatedElement 上方的注解層次結構中聲明的注解。

查找語義(Find semantics)更加詳盡,提供了語義加上對以下內容的支持:

  • 如果帶注解的元素是類,則在接口上搜索
  • 如果帶注解的元素是類,則在超類上搜索
  • 解析橋接方法,如果帶注解的元素是方法
  • 如果帶注解的元素是方法,則在接口中搜索方法
  • 如果帶注解的元素是方法,則在超類中搜索方法

支持 @Inherited

get 語義之后的方法將遵循 Java 的 @Inherited 批注的約定,另外本地聲明的注解(包括自定義組合注解)將優于繼承注解。相反,查找語義之后的方法將完全忽略 @Inherited 的存在。

源碼分析

解析流程

輔助類

AnnotationFilter

MergedAnnotation接口

MergedAnnotations接口

TypeMappedAnnotations

AnnotationsScanner
MergedAnnotationSelector
AnnotationTypeMapping
AnnotationTypeMappings
AnnotationTypeMapping
幫助理解示例

AnnotationUtils 源碼分析

AnnotatedElementUtils 源碼分析

?

總結

以上是生活随笔為你收集整理的Spring注解编程基石(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。