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

簡介

今天我要講解的是主角是 Annotation Processor,她不是什麼新技術 jdk 1.6 就存在了。 Annotation Processor是javac的一個工具,它用來在編譯時掃描和處理註解。經過Annotation Processor能夠獲取到註解和被註解對象的相關信息,而後根據註解自動生成Java代碼,省去了手動編寫,提升了編碼效率。vue

案例

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

在項目中使用Lombok能夠減小不少重複代碼的書寫。好比說constructor/getter/setter/toString等方法的編寫。 如圖:git

3ec1649b0e05292f2e4561181af713a109e.jpg

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

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

如圖: json

05a4a585145ed2535171a6a40255da51a5b.jpg

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文件)maven

spring.components 解析和加載

  1. spring-context 中添加了一個 @Indexed 註解。
  2. spring ioc 基礎註解 @Component 中組合了@Indexed註解,
  3. org.springframework.context.index.CandidateComponentsIndexLoader 則用來加載 spring.components, 標註的這些類。

問題

swagger 目前暫時還有問題,直到如今還沒修復,詳見 issues:https://github.com/springfox/...ide

優點

  1. 將運行期間的類掃描提早到了編譯期間,增長服務啓動速度。
  2. 避免各類容器類掃描的差別性,提搞兼容性。

連接

Spring 5 - spring-context-indexer:https://github.com/spring-pro...

啓發

在 Spring 5 - spring-context-indexer 的啓發下,我開發了 mica-auto。編譯期間自動生成 Spring boot 的 spring-devtools.properties, 掃描 @Configuration,自動生成到 spring.factories 文件,同時將 FeignClient 信息也生成到 spring.factories 中,供 mica 中完成 Feign 自動化配置。

不再用擔憂忘了更改 spring.factories 文件而致使服務啓動出錯。

開源推薦

Spring boot 微服務高效開發 mica 工具集:https://gitee.com/596392912/mica
Avue 一款基於vue可配置化的神奇框架:https://gitee.com/smallweigit...
pig 宇宙最強微服務(架構師必備):https://gitee.com/log4j/pig
SpringBlade 完整的線上解決方案(企業開發必備):https://gitee.com/smallc/Spri...
IJPay 支付SDK讓支付觸手可及:https://gitee.com/javen205/IJPay

相關文章
相關標籤/搜索