🍃Spring源码阅读笔记

type
status
date
slug
summary
tags
category
icon
password
原文

SpringBoot 一键启动

以前传统的做法是将web应用打包成一个 war包,然后放在 Tomcat这类的 Servlert 容器的指定目录(/webapp),启动容器。
SpringBoot应用可以打包成一个可独立执行的 jar,这样方便部署和便于调试。为了完成这个打包的 jar,做了个工作。
  1. 使用 maven 插件 将应用打包成Fat jar。
  1. 自定义启动加载
  1. 需要嵌入式容器

为什么需要打包成 Fat jar?

 
Spring Boot 应用打包为 Fat JAR(包含所有依赖的单一JAR),其内部依赖库以嵌套 JAR(嵌套在 /BOOT-INF/lib/)的形式存在,

1. Maven 插件

执行命令 mvn clean package 会做以下事情,将程序打包成一个 FatJar
  • 所有依赖包放进 BOOT-INF/lib/
  • 应用的 .class 放进 BOOT-INF/classes/
  • 加入特殊的 MANIFEST.MF 指定启动器类(比如 org.springframework.boot.loader.JarLauncher
打包这个步骤会将 spring-boot-loader 项目的类全部打包进 Fat Jar 中。

不使用插件打包结构

 
 

使用插件打包结构

全部结构视图

缩略图

 
 

2. 自定义加载器

SpringBoot 启动流程
  1. 将项目打包成 Jar 时,会讲 spring-boot-loader 项目下的所有类都打包到 jar 中,java -jar 命令实际启动的 JarLauncher 中的 main 方法,然后反射执行应用的 Application的 Main 方法(MANIFEST 文件中的Start-Class属性)。

如何验证?

解压项目的 Fat Jar,然后 cd 到解压的项目的根路径下, 然后执行 java org.springframework.boot.loader.JarLauncher ,可以看到项目正常启动的控制台日志。

3. 嵌入式容器

嵌入式容器属于是 web 服务器的特性,暂时忽略。

自动装配

SpringBoot启动会加载所有依赖 Jar 包中的 META-INF/spring.factories 文件,而不仅仅是spring-boot-autoconfigure包()中的,这是 SpringBoot (Auto-Configuration)的核心机制之一,允许开发者、第三方库或自定义 Starter 通过该文件声明自己的自动配置类。
SpringBoot的自动装配是在应用启动过程中,通过 @EnableAutoConfiguration 注解触发的其核心逻辑由 AutoConfigurationImportSelector 类实现的,整个过程发生在 Spring容器的 BeanFactory后置处理阶段。
spring-boot-autoconfigure 默认在spring-boot-starter 中引入,项目定义了很多的默认配置。例如 web容器、jdbc 等配置。

1. 加载范围

  • spring-boot-autoconfigure 包中的spring.factories,SpringBoot 官方提供的默认自动配置类(如 WebMvcAutoConfigurationDataSourceAutoConfiguration
  • 第三方库或自定义Starter的 spring.factories,并且文件中定义了 org.springframework.boot.autoconfigure.EnableAutoConfiguration 键,其配置类也会被加载。

2. 加载过程

@SpringBootApplication 是个组合注解,上面已经有了@EnableAutoConfiguration

简化流程

  1. Spring容器初始化时会扫描注解,然后会执行AutoConfigurationImportSelector 类中的方法(主要执行其中的 process()selectImports() )
  1. 读取 META-INF/spring.factories (spring-boot-autoconfigure下的和应用下的spring.factories),获取需要加载的配置类
  1. 基于@Conditional注解和 exclude 排除不符合条件的类。
  1. 注册 Bean:通过 ConfigurationClassPostProcessor 解析并注册最终的自动配置类及其 Bean。
 
Prev
Raft 论文(中文版)
Next
Spring源码阅读-IOC
Loading...