Spring如何使用@Indexed加快啟動速度
使用@Indexed加快啟動速度
Spring讀取@Component組件(派生性),有兩種實現(xiàn)方式,一種是反射,一種是ASM。反射性能低主要是要loadClass,畢竟Class,需要Load,比如掃描”com.dongguabai”需要把所有的類load,效率太慢。
ASM相當(dāng)于直接加載類的資源信息,ReadResource。
Spring5.0 后面又有了@Indexed,可以預(yù)編譯。

會生成spring.compoments文件:

跟lombok一樣在編譯期處理。
Spring5--@Indexed注解
Spring Framework 5.0作為 Spring Boot 2.0 的底層核心框架,就目前已經(jīng)發(fā)布的版本來看,相對于 Spring Framework 4.x 而言,注解驅(qū)動的性能提升不是那么明顯。
然而隨著 Spring Framework 注解驅(qū)動能能力逐漸受到開發(fā)人員的關(guān)注,尤其在 Spring Boot 應(yīng)用場景中,大量使用注解 @CompoentScan 掃描指定的 package,當(dāng)掃描的 package 所包含的類越多時,Spring 模式注解解析的耗時就越長。
對于這個問題,Spring Framework 5.0 版本引入的注解 @Indexed,為 Spring 模式注解添加索引,以提升應(yīng)用啟動性能。
舉個栗子
@Indexed
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {}
但是,注解 @Indexed 不能孤立地存在,需要在工程 pom.xml 中增加 org.springframework:spring-context-indexer 依賴:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<optional>true</optional>
</dependency>
當(dāng)工程打包為 JAR 或在 IDE 工具中重新構(gòu)建后,METE-INF/spring.components 文件將自動生成。
換言之,該文件在編譯時生成。當(dāng) Spring 應(yīng)用上下文執(zhí)行 @CompoentScan 掃描時,METE-INF/spring.components 將被 CandidateComponentsIndexLoader 讀取并加載,轉(zhuǎn)化為 CandidateComponentsIndex 對象,進而 @CompoentScan 不再掃描指定的 package,而是讀取 CandidateComponentsIndex 對象,從而達到提升性能的目的。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC 域?qū)ο蠊蚕頂?shù)據(jù)的實現(xiàn)示例
本文主要介紹了SpringMVC 域?qū)ο蠊蚕頂?shù)據(jù)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
java servlet結(jié)合Oracle搭建java的web開發(fā)環(huán)境
今天我將與大家分享一下我學(xué)JAVA WEB寫的一些小實例 ,我個人是不太喜歡書本上的晦澀的概念的,所以我花了更多的時間在一些應(yīng)用實例上,我覺得這樣的學(xué)習(xí)方式很適合我,由簡到繁,由淺入深2015-12-12
MyBatis SELECT基本查詢實現(xiàn)方法詳解
這篇文章主要介紹了MyBatis SELECT基本查詢實現(xiàn)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
解決java.lang.NoClassDefFoundError錯誤的問題
在Java開發(fā)過程中,NoClassDefFoundError是一個常見的運行時錯誤,是由于JVM在運行時找不到已編譯的類文件導(dǎo)致的,本文就來介紹一下如何解決,具有一定的參考價值,感興趣的可以了解一下2024-09-09
IDEA中的yml文件與properties互相轉(zhuǎn)換
這篇文章主要介紹了IDEA中的yml文件與properties互相轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10
springboot+vue實現(xiàn)SSE服務(wù)器發(fā)送事件的示例
本文介紹了使用Spring Boot和Vue實現(xiàn)服務(wù)器發(fā)送事件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
實例分析Java中public static void main(String args[])是什么意思
這篇文章主要介紹了實例分析Java中public static void main(String args[])的意義,詳細分析了Java主函數(shù)main關(guān)鍵字聲明的具體含義和用法,需要的朋友可以參考下2015-12-12
mybatis中使用InsertProvider注解報錯解決全過程
這篇文章主要介紹了mybatis中使用InsertProvider注解報錯解決全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

