1. 程式人生 > >spring 原始碼研究---core包總結一

spring 原始碼研究---core包總結一


core包主要功能點:
1.spring基礎設施工具類
2.解析類元資料(Metadata)
3.底層Resource資源描述及基本資源載入器實現
4.Property管理
5.型別轉換服務
6.spring環境搭建

功能實現:
1.spring基礎設施主要工具類
ClassUtils :Class的類載入 、查詢類全部資訊、類資訊的處理等
ObjectUtilsTest:基本型別的比較或陣列比較,如果認為兩個陣列是相等的
PatternMatchUtils:模式匹配 xx 模式匹配 * 、*xx 、*xx* 、xx* 、*xx*y
PropertyPlaceholderHelper:解析文字中佔位符並替換成屬性值
ReflectionUtils:非常好用的反射類,得到欄位、方法及過濾方法和方法回撥
ResourceUtils:這個解析定位資源非常好用 比如 classpath--URL-->File
SerializationUtils:序列化工具
SystemPropertyUtils:使用系統環境變數值替換佔位符來生成字串
AnnotationUtils:註解工具類 想要解析註解請找它,絕對給力。
BridgeMethodResolver:判斷是否是橋樑方法 把橋樑方法轉化為正常方法
CollectionFactory:使用Map.class List.class等常用集合型別生產物件Map List等集合物件
Constants:載入類中的public static final常量進行分析其資訊 查詢 轉換等
Conventions:根據方法返回值 、 欄位、返回相應的字串型別名稱,可以用以自動化給其起別名
ControlFlowFactory:棧軌跡資訊查詢 判斷 類 方法 及輸入值是否在棧的軌跡中
MethodIntrospector:為類中相關方法注入資料或過濾、把類中的相應的代理方法轉化為介面方法
ResolvableType:統一所有型別為ResolvableType物件來操作型別,很贊,使用很方便

還有其他很讚的工具類可以使用。

2.解析類元資料
類中的元資料
包含了類元資料、方法元資料及註解元資料
spring使用了兩種方式來注入元資料獲得類、註解、方法元資料資訊
 1.使用ASM方式
 2.使用標準的反射
ASM方式通過載入class資源讀取到相應的訪問器裡,來填充相應的元資料。使用了訪問器模式。
使用標準的反射方式從Class物件獲取類、方法、欄位、註解等資訊注入到元資料中。
ClassMetadata介面裝載類元資料,使用ClassMetadataReadingVisitor從ASM中取出類元資料填充ClassMetadata
還可以使用StandardClassMetadata從反射中取的元資料填充
AnnotationMedata介面不僅裝載類元資料,還裝載所有註解元素,使用AnnotationMetadataReadingVisitor從ASM中
取出類元資料和註解元資料填充到AnnotationMedata中,還可以使用StandardAnnotationMedata從反射中取的元資料填充
AnnotatdTypeMedata介面定義被註解的型別(這裡包括了類及方法)上的所有註解資訊,它獲取直接使用反射
MethodMedata介面和AnnotationMedata介面都繼承它,MethodMedata裝載了方法元資料,
使用MethodMetadataReadingVisitor從ASM中訪問得到元資料填充。還可以使用StandardMethodMedata
從反射中取的元資料填充
AnnotationAttributesReadingVisitor全部都是作為訪問一個註解屬性物件返回給了AnnotationMetadataReadingVisitor訪問器中

spring使用了工廠MetadataReaderFactory來建立元資料讀取器MetadataReader,工廠需要的io資源是資源定位路徑或Resource物件,
而建立的MetadataReader則包含了ClassMetada和AnnotationMetada供使用。它使用的ASM方式來獲取的元資料,ASM方式要比反射速度快很多。

當然除了生產Metadata,spring還設計過濾器TypeFilter來過濾工廠中的Metadata資料, 使用了模板方法
1.RegexPatternTypeFilter使用正則模式來過濾需要的Metadata
2.AssignableTypeFilter使用型別層次來過濾需要的Metadata
3.AnnotationTypeFilter過濾掉非此annotation型別的Metadata