1️⃣SpringBoot源码启动的步骤
Spring Boot的启动源码可以分为以下几个阶段,每个阶段都有不同的功能:
1.1 加载配置文件阶段
读取并解析application.properties和application.yml等配置文件。
将配置信息加载到Environment对象中,以供后续使用。
1.2 创建应用上下文阶段
根据配置信息创建ApplicationContext,默认为AnnotationConfigApplicationContext或GenericApplicationContext实例。注册Bean定义,扫描注解并将其转换为相应的Bean定义。
1.3 准备阶段
配置ApplicationContext的一些属性,如相关的监听器、ResourceLoader等。
设置ApplicationContext的环境变量,包括激活的Profiles等。
执行ApplicationContextInitializer接口的initialize()方法,完成初始化操作。
1.4 刷新上下文阶段
调用ApplicationContext的refresh()方法,开始刷新上下文。
进行Bean的初始化操作,包括实例化、依赖注入、后处理等。
触发各种生命周期回调,如BeanPostProcessor等。
1.5 启动阶段
检查ApplicationContext中是否存在ApplicationRunner和CommandLineRunner接口的实现类。
如果存在,通过反射执行它们的run()方法,执行自定义的启动逻辑。
1.6 完成阶段
发布ApplicationReadyEvent事件,表示应用程序已经准备就绪。
执行ApplicationContext注册的其他回调方法或者监听器。
2️⃣启动阶段的功能
- 1 加载配置文件阶段:读取配置文件,并将配置信息加载到Environment对象中,为后续使用做准备。
- 2 创建应用上下文阶段:创建并配置应用的上下文,包括Bean定义的扫描和注册。
- 3 准备阶段:配置ApplicationContext的属性和环境变量,并执行初始化操作。
- 4 刷新上下文阶段:刷新上下文,进行Bean的初始化和生命周期回调。
- 5 启动阶段:执行自定义的启动逻辑,如ApplicationRunner和CommandLineRunner接口的实现类。
- 6 完成阶段:发布应用程序已经准备就绪的事件,并执行其他回调方法或监听器。
这些阶段的顺序和功能确保了Spring Boot应用程序的正确启动和准备就绪,使应用程序可以正常运行。
3️⃣源码解读
3.1 源码解读启动的详细流程
- 加载启动类:通过Java的反射机制,加载指定的启动类(通常是带有@SpringBootApplication注解的类)。
- 解析配置: 根据spring-boot-starter依赖中的META-INF/spring.factories文件,获取所有自动配置类的全限定名。然后根据配置文件(如application.properties和application.yml)读取配置信息,并将其加载到Environment中。
- 创建启动类的应用上下文:使用ApplicationContextInitializer接口初始化应用上下文,并按需设置激活的Profiles、默认属性等。
- 预准备: 执行SpringApplicationRunListeners接口的starting()方法,触发应用程序启动前的事件监听器。
- 准备阶段:
- 创建BeanFactory对象。
- 注册ApplicationContextInitializer接口的实现类,执行其initialize()方法。
- 注册ApplicationListener接口的实现类,准备发布应用程序事件。
- 刷新上下文: 执行ApplicationContext的refresh()方法,进行Bean的加载、实例化、依赖注入等操作。
- 后置处理: 应用启动完成,执行ApplicationRunner和CommandLineRunner的扩展,可以完成一些启动后初始化工作。
- 启动完成: 执行SpringApplicationRunListeners接口的started()方法,触发应用程序已经启动的事件监听器。
- 运行应用程序:根据配置和自动装配机制,创建并启动Spring Boot应用程序。
- 运行阶段: 执行SpringApplicationRunListeners接口的running()方法,触发应用程序运行中的事件监听器。
- 应用程序失败处理: 在应用程序出现异常时,执行SpringApplicationRunListeners接口的failed()方法,触发应用程序启动失败的事件监听器。
4️⃣ 扩展接口
在以上这个过程中,有一些扩展点可以进行自定义扩展:
- 1. ApplicationContextInitializer接口:用于在创建应用上下文之前对其进行初始化操作。
- 2. BeanPostProcessor接口:用于在Bean实例化和初始化过程中对其进行后置处理。
- 3. ApplicationRunner接口和CommandLineRunner接口:用于定义在应用程序已经启动后执行的任务。
- 4. SpringApplicationRunListener接口:用于定义应用程序启动和运行期间的事件监听器,可以在应用程序的不同阶段执行自定义逻辑。
通过实现或扩展这些接口,可以在Spring Boot的启动过程中添加自定义的功能、初始化操作或者监听应用程序事件。