02.SpringBoot启动原理.pdf
image.png

SpringBoot 是如何通过jar包启动的

当我们运行java -jar的时候,会去找jar包中的manifest文件,除了指定Start-Class:Springboot的启动类以外,还指定了Main-Class,JarLauncher是SpringBoot自定义的类加载器,通过加载BOOT-INF/classes目录及BOOT-INF/lib目录下jar文件,当加载完了,再通过反射方式,去执行Start-Class类里面的run方法,实现项目启动。
image.png

总结

image.png
JarLauncher通过加载BOOT-INF/classes目录及BOOT-INF/lib目录下jar文件,实现了fat jar的启动。
SpringBoot通过扩展JarFile、JarURLConnection及URLStreamHandler,实现了jar in jar中资源的加载。
SpringBoot通过扩展URLClassLoader–LauncherURLClassLoader,实现了jar in jar中class文件的加载。

  1. 注:假如你想要实例化一堆bean,可以通过配置文件先将这些bean实例化到容器,等其他项目调用时,在spring.factories中写入这个配置文件的路径即可!

SpringBoot是如何启动Spring容器

@SpringBootApplication注解

SpringApplication.run()

1、创建SpringApplicaiton实例

会new AnnotationConfigApplicationContext对象里面有refresh方法,将配置类加载成BeanDefinition,最终加载到容器中。
image.png
refresh方法里面的invokeBeanFactoryPostProcessors方法:解析配置类中的BeanDefinition
image.png
refresh方法里面的finishBeanFactoryInitialization方法:调用BeanFactory,将BeanDefinition生成了Bean。
image.png

2、调用run()方法

有refresh方法用于将配置类加载到容器中