java mvc 新趨勢——從執行期間類掃描到編譯期間

如夢技術發表於2019-01-25

簡介

今天我要講解的是主角是 Annotation Processor,她不是什麼新技術 jdk 1.6 就存在了。 Annotation Processor是javac的一個工具,它用來在編譯時掃描和處理註解。通過Annotation Processor可以獲取到註解和被註解物件的相關資訊,然後根據註解自動生成Java程式碼,省去了手動編寫,提高了編碼效率。

案例

大部分java 開發者每天也在使用她,比較著名的就是 Lombok

在專案中使用Lombok可以減少很多重複程式碼的書寫。比如說constructor/getter/setter/toString等方法的編寫。

如圖:

lombok

感觸最大的就是,新增或更改了 feild 屬性,再也不用去生成 get set 了。

spring boot 中最典型的算 spring-boot-configuration-processor 了。他會在程式碼編譯期間將我們的配置資料 spring-configuration-metadata.json 生成到 jar 包中。方便 idea 識別出來,並提供友好的提示。

如圖:

props

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.components 解析和載入

  1. spring-context 中新增了一個 @Indexed 註解。

  2. spring ioc 基礎註解 @Component 中組合了@Indexed註解,

  3. org.springframework.context.index.CandidateComponentsIndexLoader 則用來載入 spring.components, 標註的這些類。

問題

swagger 目前暫時還有問題,直到現在還沒修復,詳見 issues:github.com/springfox/s…

優勢

  1. 將執行期間的類掃描提前到了編譯期間,增加服務啟動速度。

  2. 避免各種容器類掃描的差異性,提搞相容性。

連結

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 檔案而導致服務啟動出錯。

相關文章