🍃Spring源码阅读笔记
type
status
date
slug
summary
tags
category
icon
password
原文
SpringBoot 一键启动
以前传统的做法是将
web应用
打包成一个 war
包,然后放在 Tomcat这类的 Servlert 容器的指定目录(/webapp),启动容器。SpringBoot应用可以打包成一个可独立执行的 jar,这样方便部署和便于调试。为了完成这个打包的 jar,做了个工作。
- 使用 maven 插件 将应用打包成Fat jar。
- 自定义启动加载
- 需要嵌入式容器
为什么需要打包成 Fat jar?
Spring Boot 应用打包为 Fat JAR(包含所有依赖的单一JAR),其内部依赖库以嵌套 JAR(嵌套在
/BOOT-INF/lib/
)的形式存在,1. Maven 插件
2. 自定义加载器
SpringBoot 启动流程
- 将项目打包成 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 官方提供的默认自动配置类(如WebMvcAutoConfiguration
、DataSourceAutoConfiguration
)
- 第三方库或自定义Starter的
spring.factories
,并且文件中定义了org.springframework.boot.autoconfigure.EnableAutoConfiguration
键,其配置类也会被加载。
2. 加载过程
@SpringBootApplication
是个组合注解,上面已经有了@EnableAutoConfiguration
简化流程
- Spring容器初始化时会扫描注解,然后会执行
AutoConfigurationImportSelector
类中的方法(主要执行其中的process()
和selectImports
()
)
- 读取
META-INF/spring.factories
(spring-boot-autoconfigure
下的和应用下的spring.factories
),获取需要加载的配置类
- 基于
@Conditional
注解和exclude
排除不符合条件的类。
- 注册 Bean:通过
ConfigurationClassPostProcessor
解析并注册最终的自动配置类及其 Bean。
Prev
Raft 论文(中文版)
Next
Spring源码阅读-IOC
Loading...