簡介
今天我要講解的是主角是 Annotation Processor
,她不是什麼新技術 jdk 1.6
就存在了。
Annotation Processor是javac的一個工具,它用來在編譯時掃描和處理註解。通過Annotation Processor可以獲取到註解和被註解物件的相關資訊,然後根據註解自動生成Java程式碼,省去了手動編寫,提高了編碼效率。
案例
大部分java 開發者每天也在使用她,比較著名的就是 Lombok
。
在專案中使用Lombok
可以減少很多重複程式碼的書寫。比如說constructor/getter/setter/toString
等方法的編寫。
如圖:
感觸最大的就是,新增或更改了 feild 屬性,再也不用去生成 get set 了。
spring boot 中最典型的算 spring-boot-configuration-processor
了。他會在程式碼編譯期間將我們的配置資料 spring-configuration-metadata.json 生成到 jar 包中。方便 idea 識別出來,並提供友好的提示。
如圖:
spring 5 spring-context-indexer 淺析
生成 spring.components
檔案
maven
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>5.1.4.RELEASE</version>
<scope>optional</scope>
</dependency>
複製程式碼
Gradle
annotationProcessor "org.springframework:spring-context-indexer:5.1.4.RELEASE"
複製程式碼
專案編譯完成時就會就會生成 META-INF/spring.components
檔案到 jar 包中。
圖(spring.components)
spring.components
解析和載入
-
spring-context 中新增了一個
@Indexed
註解。 -
spring ioc 基礎註解
@Component
中組合了@Indexed
註解, -
org.springframework.context.index.CandidateComponentsIndexLoader
則用來載入spring.components
, 標註的這些類。
問題
swagger 目前暫時還有問題,直到現在還沒修復,詳見 issues:github.com/springfox/s…
優勢
-
將執行期間的類掃描提前到了編譯期間,增加服務啟動速度。
-
避免各種容器類掃描的差異性,提搞相容性。
連結
Spring 5 - spring-context-indexer:github.com/spring-proj…
啟發
在 Spring 5 - spring-context-indexer 的啟發下,我開發了 mica-auto。編譯期間自動生成 Spring boot 的 spring-devtools.properties, 掃描 @Configuration,自動生成到 spring.factories 檔案,同時將 FeignClient 資訊也生成到 spring.factories 中,供 mica 中完成 Feign 自動化配置。
再也不用擔心忘了更改 spring.factories 檔案而導致服務啟動出錯。