spring-boot:run 是怎麼找到使用了註解@SpringBootApplication的

《mvn spring-boot:run 指令是怎麼運行起spring boot項目的》 上一篇的文章介紹了這個指令是怎麼運行起一個spring boot項目的,可是並未詳細說是怎麼找到使用了註解@SpringBootApplication並含有main方法的類的,本文就打算說一下這個。java

查找主類的代碼,在spring-boot-tools/spring-boot-loader-tools的MainClassFinder.java,關鍵方法是static <T> T doWithMainClasses(File rootFolder, MainClassCallback<T> callback)git

順着這個方法的代碼,注意到spring有一套自用的asm框架,用來解析*.class 文件的,即解析字節碼的。再搜了下,Java如今也有一套成熟的asm框架https://asm.ow2.io/,切面編程說是都須要用到asm。github

asm解析後都使用訪問者模式來訪問解析後的代碼,能夠判斷這個類有沒有main方法,使用了哪些類註解等等信息,這樣子就可以找到使用了註解@SpringBootApplication並含有main方法的類,而後就能運行起來,讓spring boot項目跑起來了。spring

抽絲剝繭後,我精簡了代碼,運行起來能夠找到一個spring boot項目的主類,代碼在 https://github.com/shahuwang/..., springboot_mainclass_finder 這個tag便是。編程

這裏面的核心就是用asm解析*.class文件,而後獲取代碼的相關信息。segmentfault

相關文章
相關標籤/搜索