My logo
Published on

Spring Boot 原理学习-03

Spring boot 2.x 的JarLauncher运行原理

Spring boot帮助你打出来的这么一个jar包,mvn package进行打包的时候,默认会走一个srping boot maven插件repackagejar.original也是maven打出来的,jar包不是完整 jar。

jar.original默认来说打出来的话,是原始jar,jar包里只有我们自己写的一点代码,没有我们依赖的第三方jar包打进去,mvn package,如果没有其他的插件帮助你的话,他默认情况下,给你搞出来的jar包,jar.original,原始jar包,没法运行的,跑不起来。

spring boot maven插件,mvn package打包之后,会被你的spring boot maven插件来接管,他会把你的jar包重命名为jar.original,他自己做一个repackage,他打包,会把你的代码编译以后的class字节码文件+ 依赖第三方jar(从本地的maven仓库里来),把所有的这些东西,按照我们刚才看到的目录结构去做一个组织。

再加上一些别的东西,JarLauncher一类的东西,一堆class字节码和jar包,都放在一起了,java -jar命令去运行,默认就会启动一个jvm进程,加载一个main class进来来执行主类的代码。

java -jar,他的规范,他是如何寻找你的main class,必须在你的打包以后的jar包里,/META-INF/MANIFEST.MF文件里,配置你的main class,jvm进程会加载你的这个文件里指定的main class,来main方法。

java -jar 的main class,定义在/META-INF/MANIFEST.MF中,这是规范,JarLauncher在jvm进程中通过静态方法调用,直接调用我们的main class,jvm进程执行的main class不是我们写的那个main class,其实是springboot提供的JarLauncher类。

他会通过static method,静态方法的调用,App.main(),去驱动你的main方法的执行,Spring boot 线上生产环境再跑的,jarlauncher跑起来。

spring boot 2.x 自动装配实现原理分析

如何实现自动装配的,@SpringBootApplication注解是极为关键的一个注解,主要就是依靠他去启用自动装配

@EnableAutoConfiguration,激活自动装配特性,加了这个注解,spring boot框架在运行的额过程中,因为有这个注解,他的自动装配的特性就会激活可以使用,通过他来激活我们的自动装配特性

@ComponentScan,激活spring的注解bean自动扫描特性

@SpringBootConfiguration->@Configuration->@Component,把当前类标注为configuraion配置类,这个很关键,这样的话,其实spring容器会把启动类也当做bean扫描进去

@Configuration注解,他其实是spring提供的,一般来说是怎么来用的,这个注解,@Configurtion标注一个类,在这个类里面,写一些方法,方法上打@Bean注解,@Bean注解标注了以后,方法里构建一个对象实例,返回,对象实例就会被纳入spring容器管理中去,作为一个spring bean

@Component,代表了当前的类,需要被你的spring扫描到,他就会把你的这类实例化bean纳入到他的容器管理中去。

如果说要启用spring boot的自动装配他的特性启用之后,他的功能就会开始运行,他会自动扫描当前你自己的工程,jar包下,依赖的所有的jar包下,如果说有spring.factories文件读取,里面可以去配置你的工程当前提供的spring boot自动转配的类。

很多自动装配的,他是有条件的去运行的,他不会无缘无故的去装配,他可能需要依赖你的classpath里,有依赖的某个框架的jar包以后,classpath里有指定的某个框架的类,发现这个类以后,才会说去装配那个框架对应的bean实例。

spring-boot-auconfigure,META-INF/spring.factories,读取,然后进行自动装配,自动装配的时候,有@ConditonalOnClass这种有条件的注解,你得满足条件才能进行自动装配,举例,可以看看tomcat的自动装配是如何做的,还有spring webmvc的自动装配是如何做的。

spring-boot-autoconfigure 内嵌自动装配

spring boot引入他,他自己引入一个依赖,spring-boot-autoconfigure,这个工程,内嵌了很多spring boot直接提供出来给我们来使用的自动装配,比如说,你只要引入某个框架的依赖,对这个框架你什么都不用做,spring-boot-autoconfigure里面的针对这个框架的自动装配的类,他直接会发现你的classpath有某个指定框架的类

他就自动的针对你这个框架开始进行bean组装和装配,把一个bean纳入到spring容器管理范围内去

如果你要用某个框架,直接在代码里@Autowired 让spring容器给你注入这个自动装配好的框架的bena实例

/META-INF/spring.factories里,是有一大堆的内嵌的自动装配的,他自己去会去扫描,尝试去执行各个自动装配,如果你的classpath里,pom.xml里没有引入redis依赖,他没有必要去给您来执行RedisAutoConfiguration

spring-boot-tomcat 自动装配过程分析

DispatcherServletAutoConfiguration,应该知道spring webmvc,他最核心的代码和入口类,DispatcherServlet,他的是核心入口,tomcat可以是把所有的请求转发给servlet,让请求纳入到我们的spring webmvc框架的处理里面来了

WebMvcAutoConfiguration,spring webmvc的自动装配是他

spring boot代码在运行的时候,扫描我们的classpath下的jar包里面的/META-INF/spring.factoreis文件,看看各个依赖jar里是否配置了自动装配,spring-boot-autoconfigure里去,他里面确实有/META-INF/spring.factories,扫描,把他里面配置的各种自动装配的类都扫描到

就可以从spring-boot-auconfigure jar包里加载出来对应的一个一个的自动装配的类,class,load到jvm里来

ServletWebServerFactoryAutoConfiguration,tomcat来说,他是运行servlet的web server,ServletWebServerFactoryAutoConfiguration是我们的tomcat server的自动装配的组件和逻辑入口

@ConditionalOnClass,我们自动内嵌提供的大量的自动装配,他不会无缘无故的去运行的,必须要有依赖某个技术,在依赖jar包里可以扫描到某个指定的class,一个类,此时我的自动装配才可以运行

connector customizer,tomcat connector是其中一种组件,如果我们要对tomcat connector进行定制化,如果说有类似的customizer定制化的组件,此时的话呢,就可以把他定制,然后再给用起来

connector、host、engine、context,这些东西都是tomcat内部的组件体系设计,他们分别都属于tomcat组件,Tomcat这个类更多的其实是初始化和组装我们的tomcat内部的组件体系

对于他的webserver,对外监听端口号,处理网络请求,ServletRequest来说,一般来说你必须得有servlet容器引入进来,这个类才会有,tomcat引入进来了,servlet request就必然会有:

ErrorMvcAutoConfiguration

HttpEncodingAutoConfiguration

MultipartAutoConfiguration