本文共 1154 字,大约阅读时间需要 3 分钟。
类的加载机制
深入了解类的加载,是因在看spring-boot自动装备的注解(@EnableAutoConfiguration)的时候,spring boot 是怎样装备spring-boot-starter的。
其中我们自己在编写的spring-boot-starter会最终打成jar包,并且在编写spring-boot-starter的时候,我们会在资源文件夹,新建一个META-INF文件夹,再新建一个spring.factories的文件。并配置需要spring-boot所需要引导的类,在这个文件里面,举例如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
com.test.app.ClientAppliation,
com.test.app.ClientAppliation,
com.test.app.ClientAppliation
分析spring boot源码,我们会发现,spring boot 会扫描lib路径(java.class.path)所有的jar包,然后获取到这些jar中的文件,例如,.class文件, properties文件,.factories文件。spring-boot会识别到factories文件,并将配置文件里面配置的类,通过java类的反射生成类的实例。并且会扫描这些类的注解,看这些类还依赖了那些类。例如,我们再编写spring-boot的时候,会用Import的注解。
当再分析spring-boot的时候,出现了ClassLoader,并且这个类加载器已经实例化,我就好奇这个类加载器在什么时候加载的。其实,spring-boot应用启动就是应用了SystemClassLoader类加载器,其实系统的类加载器,在初始化就会在java.class.path指定的路径下的文件,然后java.class.path这个路径又是什么时候初始化的呢,其实是在System类里面有个本地方法,initProperties()初始化java.class.path.
其实在生产环境,java -jar :我们在jar包所有的目录,执行这条指定,其实执行的是org.springframework.boot.loader.JarLauncher.这个类最后引导jvm的系统类加载器先加载META-INFO/lib里面的的文件路径。后面再调用Main函数所在的类,具体可以看JarLauncher的源码。可以在pom文件中引入spring-boot-loader.就可以查看源码了。
针对类的加载 系统类加载,扩展类加载其,bootstrap类加载器,其他博客都有很详细的解释。
转载地址:http://ausoi.baihongyu.com/