javascript
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注解编程基石(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring注解编程基石(二)
- 下一篇: Spring AbstractBeanF