1

《mvn spring-boot:run 指令是怎么运行起spring boot项目的》 上一篇的文章介绍了这个指令是怎么运行起一个spring boot项目的,但是并未详细说是怎么找到使用了注解@SpringBootApplication并含有main方法的类的,本文就打算说一下这个。

查找主类的代码,在spring-boot-tools/spring-boot-loader-tools的MainClassFinder.java,关键方法是static <T> T doWithMainClasses(File rootFolder, MainClassCallback<T> callback)

顺着这个方法的代码,注意到spring有一套自用的asm框架,用来解析*.class 文件的,即解析字节码的。再搜了下,Java现在也有一套成熟的asm框架https://asm.ow2.io/,切面编程说是都需要用到asm。

asm解析后都使用访问者模式来访问解析后的代码,可以判断这个类有没有main方法,使用了哪些类注解等等信息,这样子就能够找到使用了注解@SpringBootApplication并含有main方法的类,然后就能运行起来,让spring boot项目跑起来了。

抽丝剥茧后,我精简了代码,运行起来可以找到一个spring boot项目的主类,代码在 https://github.com/shahuwang/..., springboot_mainclass_finder 这个tag即是。

这里面的核心就是用asm解析*.class文件,然后获取代码的相关信息。


沙湖王
62 声望12 粉丝

知识需要分享才能延续生命!